反射
1. 背景
应用程序结果分为应用程序域-程序集-模块-类型-成员几个层次,公共语言运行时(CLR)加载器管理应用程序域,这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。
程序集包含模块,而模块包含类型,类型又包含成员,反射则提供了封装程序集、模块和类型的对象。我们可以使用反射动态地创建类型的实例,将类型绑定到现有对象或从现有对象中获取类型,然后调用类型的方法或访问其字段和属性。
2. 反射是什么?
反射(Reflection)是.NET中的重要机制,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件、以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。
3. 实例
首先我们先介绍一下例子中的抽象类和子类。

 
 
 如果我们不使用反射来对子类进行访问,于是我们的代码如下:
得到的结果是:

试想一下,如果我们再加一个人物类别,比如新加一个类(如:校长),这个时候上面的switch case的代码会相应的发生增加一个case, 这样就不利于维护,如果能够在增加类的时候不对原来的主要程序不做更改,这个时候反射就是一种很好的解决方案。
下面我们使用反射来实现对子类的调用,反射代码如下:
 
 
当然上面给property设置值的部分,我们可以选择设置和不设置,在设置之后,其运行结果为:

我们使用反射,通过使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。
(1) 通过Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
(2) 使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等。使用Type的GetConstructors()或GetConstructor()方法来调用特定的构造函数。
(3) 使用MethodInfo了解方法的名称,返回类型、参数、访问修饰符(如public或private)和实现详细信息(如abstract或virtual)等。使用Type的GetMethods()或GetMethod()方法来调用特定的方法。
(4) 使用FiledInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。
(5) 使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。
(6) 使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。
(7) 使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。
4. 反射的优缺点
(1) 优点
很灵活,可扩展性更强;降低耦合性,自适应力强;允许程序动态创建并能控制程序集中的所有的类。
(2) 缺点
使代码变得更加复杂;性能较差,因为其过程是一个解释过程,需要遍历集合中的所有类找到目标类。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号