MsSQL   发布时间:2022-05-16  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了反射大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

反射是.net中的重要机制。通过反射,可以在运行时获得.net中每一个类型(包括类、结构、委托和枚举等)成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。

有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。

反射的用途:

(1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。

(2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

(3)使用COnstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或privatE)和实现详细信息(如abstract或virtual)等。使用Type的GetConstructors或GetConstructor方法来调用特定的构造函数。

(4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或privatE)和实现详细信息(如abstract或virtual)等。使用Type的getmethods或getmethod方法来调用特定的方法。

(5)使用FiedInfo了解字段的名称、访问修饰符(如public或privatE)和实现详细信息(如statiC)等,并获取或设置字段值。

(6)使用EvenTinfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。

(7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。

(8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。

在设计模式中,用到反射技术,可以简化工厂的实现,极大地简化对象的生成,可以精化模式:

(1)工厂方法:通过反射可以将需要实现的子类名称传递给工厂方法,这样无须在子类中实现类的实例化。

(2)抽象工厂:使用反射可以减少抽象工厂的子类,简化工厂代码的复杂程度。

(3)命令模式:可以采用命令的类型名称作为参数直接获得命令的实例,并且可以动态执行命令。

(4)享元模式:采用反射技术实例化享元可以简化享元工厂。

下面看一下反射的具体代码:

先对比一下常规写法和反射的写法

// 常规的写法
IUser result=new sqlserverUser();

 

//反射的写法
using System.Reflection;//引用命名空间
IUser result=(IUser)Assembly.Load("抽象工厂模式").CreateInstance("抽象工厂模式.sqlserverUser")
//第一个抽象工厂模式是当前“程序集”的名称
//第二个是当前命名空间的名称
//后面是要实例化的“类名”

通过上面两种写法的对比,我们可以看出常规方法是写明了要实例化sqlserverUser对象。反射的写法可以用变量来处理,根据需要进行更换。反射可以利用字符串来实例化对象。

下面我们用一个具体的类来看一下常规的写法:

class DataAccess
    { 
        private static readonly String db="sqlserver";//数据库名称
        //private static readonly String db="Access";
        public static IUser createuser()
        {
            IUser result = null;
            switch (db)//由于db的实现设置,多疑此处可以根据选择,实例化出相应的对象
            { 
                case "sqlserver":
                    result = new sqlserverUser();
                    break;
                case "Access":
                    result = new AccessUser();
                    break;
            }
            return result;
        }
        public static IDepartment createuser()
        {
            IDepartment result = null;
            switch (db)
            { 
                case "sqlserver":
                    result = new sqlserverUser();
                    break;
                case "Access":
                    result = new AccessUser();
                    break;
            }
            return result;
    }

我们可以看出上面的代码switch判断会给我们带来麻烦。当我们再增加一个Oracle数据库访问的时候,我们只能去改变switch语句,违反程序设计的对修改封闭的原则。下面我们再看一下反射的写法:

using System.ReflCETion;//引用反射
class DataAccess
    {
        private static readonly String AssemblyName="抽象工厂模式";//程序集名称
        private static readonly String db="sqlserver";//数据库名称,可以替换成Access

        public static IUser createuser()
        {
            String ClassName=AssemblyName+"."+db+"User";
            return (IUser )Assembly.Load (AssemblyName ).CreateInstance (ClassName );
        }
        public static IDepartment  CreateDepartment()
        {
            String ClassName=AssemblyName+"."+db+"User";
            return (IDepartment)Assembly.Load (AssemblyName ).CreateInstance (ClassName );
        }
    }

这样,我们就将程序由编译时运行时。由于‘CreateInstance("抽象工厂模式.sqlserverUser")’中的字符串是可以写成变量的,而变量的值到底是sql Server,还是Access,完全可以由事先的那个db变量来决定。所以就省去了用switch判断的麻烦。 这样修改后已经很好了,但是在更换数据库访问时,我们要是要去改程序重编译,本例中就该修改db变量的值。这样还是不够完美。为了达到正真符合开放-封闭原则。我们可以再利用配置文件来解决更改DataAccess的问题。我们可以读文件给DB字符串赋值,在配置文件中写明是sqlserver还是Access。应用反射+配置文件+抽象工厂模式解决数据库访问时的可维护、可扩展的问题。

大佬总结

以上是大佬教程为你收集整理的反射全部内容,希望文章能够帮你解决反射所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:以及