反射(一)

来源:互联网 发布:deepin linux 假死 编辑:程序博客网 时间:2024/05/22 03:32

关于反射,在学习设计模式时,抽象工厂中用到了反射的机制,这次在高校中也通过反射来实现了很多功能。但具体怎么用,反射究竟是怎么回事儿,还是个小糊涂仙儿。查些资料学习一下:

一、定义

审查元数据并收集关于它的类型信息的能力。那么元素据又是怎么一回事儿,就像在调用底层类库时,跳到最后,显示出‘从元素据’,指的应该是编译好的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,

来映射各个字段的属性,也是这个原理。

以上是关于反射的一些基础知识,接下来还要多多了解关于反射中各个类的使用等。



0 0
原创粉丝点击