好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

反射整理学习

反射整理学习

前言:    

由于身边也没什么学习资料,也就一边利用网络一边自己理解整理,慢慢地步入神秘的反射机制。

 

 

 

    反射 提供了封装程序集、模块和类型的对象(Type 类型) 。可以使用反射 动态创建类型 的实例, 将类型绑定到现有对象 ,或 从现有对象获取类型并调用其方法或访问其字段和属性 。如果代码中使用了属性,可以利用反射对它们进行访问。

简而言之, 反射机制指的是程序在运行时能够获取自身的信息。例如一个对象能够在运行时知道自己有哪些方法和属性。

 

 

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

使用  Module  发现以下信息:包含模块的程序集以及模块中的类等。您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

使用  ConstructorInfo  发现以下信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用  Type  的  GetConstructors  或 GetConstructor  方法来调用特定的构造函数。

使用  MethodInfo  发现以下信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用  Type  的  GetMethods  或 GetMethod  方法来调用特定的方法。

使用  FieldInfo  发现以下信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如 static)等;并获取或设置字段值。

使用  EventInfo  发现以下信息:事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。

使用  PropertyInfo  发现以下信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。

使用  ParameterInfo  发现以下信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。

当您在一个应用程序域的仅反射上下文中工作时,请使用  CustomAttributeData  来了解有关自定义属性的信息。使用  CustomAttributeData ,您不必创建属性的实例就可以检查它们。

程序集,模块,类型,成员之间的关系(这里我做一简要说明)

程序集是.NET框架应用程序的构造块,程序集构成部署,版本控制,重复使用,激活范围控制和安全权限的基本单元。

直接说重点:程序集包含模块,而模块包含类型,类型有包含成员。

    我们承接上面的内容, System.Reflection 这个命名空间下定义了一系列的类,他们与 System.Type 类一起提供反射功能。看完这一句话你应该明白了, System.Reflection 命名空间下的一系列的类和 System 命名空间下的 Type 类是一起提供了反射功能,缺一不可。于是我们实现反射功能,为什么会至少会引用以下两个命名空间:

现在我们来看一下 System.Reflection 命名空间下的主要类的功能:(下面列举几个常用的)

Assembly 表示一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行时应用程序构造块。  Module   在模块上执行反射。 ConstructorInfo 发现类构造函数的特性并提供对构造函数元数据的访问权。 MethodInfo 发现方法的特性并提供对方法元数据的访问。 FieldInfo 发现字段特性并提供对字段元数据的访问权。 PropertyInfo 发现属性的特性并提供对属性元数据的访问。 CustomAttributeData 提供对加载到只反射上下文中的程序集、模块、类型、成员和参数的自定义特性数据的访问。  EventInfo  发现事件的特性并提供对事件元数据的访问权。

System.Reflection.Emit  命名空间的类提供了一种特殊形式的反射,使您能够在运行时生成类型。

反射也可用于创建称作 类型浏览器 的应用程序 ,它使用户能够选择类型,然后查看有关选定类型的信息。

System.Reflection  命名空间中的类最常用的方法都使用统一的模式。 Module,Type 和 MemberInfo 类的成员都具有如下基本形式:

MyInstance[]FindXxx(filter,filterCriteria) :查找并返回经过筛选的类型列表,或者在当前类型没有实现任何匹配筛选器的类型的情况下返回空数组。 MyInstance GetXxx(<parameters>): 返回由 <parameters> 唯一指定的类型,如果不存在这样的类型,成员将返回一个空引用。 MyInstance[]GetXxxs(): 返回所有的公共类型,如果不存在公共类型,成员将返回空数组。 MyInstance[]GetXxxs(<parameters>): 返回由 <parameters> 指定的所有类型,如果不存在这样的类型,成员将返回空数组


 

Type类为 System.Refection  实现反射功能的基础,也是访问程序集的元数据的主要方式。

对于Type类我们先熟悉一下它提供了那些属性和方法,当然用法很简单,我们看完它的内容就小小的测试一下:

具体的可以在MSDN自己看: http://msdn.microsoft.com/zh-cn/library/42892f65.aspx

泛型类型定义不可以从封闭构造的类型赋值。也就是说,不能将封闭构造类型 MyGenericList<int> 赋给 MyGenericList<T> 类型的变量。

下面是我的测试代码:

TyepTest Code

运行结果:

       

分类:  C#面向对象编程

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于反射整理学习的详细内容...

  阅读:37次