关于反射,在学习设计模式时,抽象工厂中用到了反射的机制,这次在高校中也通过反射来实现了很多功能。但具体怎么用,反射究竟是怎么回事儿,还是个小糊涂仙儿。查些资料学习一下:
一、定义
审查元数据并收集关于它的类型信息的能力。那么元素据又是怎么一回事儿,就像在调用底层类库时,跳到最后,显示出‘从元素据’,指的应该是编译好的dll。
元素据:编译以后的最基本数据单元,就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。
二、包含的类
System.Reflection.Assembly
System.Reflection.MemberInfo
System.Reflection.EventInfo
System.Reflection.FieldInfo
System.Reflection.MethodBase
System.Reflection.ConstructorInfo
System.Reflection.MethodInfo
System.Reflection.PropertyInfo
System.Type
这些类的具体使用:
(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、反射主要应用于类库,这些类库需要知道一个类型的定义,以便提供更多的功能。
四、简单应用
1、在抽象工厂中我们用到了System.Assembly这个类,通过它来创建与对应D层相应的接口,
通过这个接口,我们在调用D层的方法。
这里我们用了一个Load方法来加载程序集,并通过CreateInstance来创建具体的实例。
在Assembly类中还有另外一个方法LoadForm:传递一个程序集文件的路径名(包括扩展名),
CLR会载入您指定的这个程序集,传递的这个参数不能包含任何关于版本号的信息,区域性,
和公钥信息,如果在指定路径找不到程序集抛出异常。
2、在机房收费系统中将datatable转换成list时,公共的一个转换方法中用到的System.PropertyInfo,
来映射各个字段的属性,也是这个原理。
以上是关于反射的一些基础知识,接下来还要多多了解关于反射中各个类的使用等。