码迷,mamicode.com
首页 > Windows程序 > 详细

30. C# -- 反射(2)

时间:2015-05-26 16:29:20      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:c#   反射   dll   

1、什么是反射

    可以Ildasm反编译工具浏览一个dll和exe的构成。

   用于运行时通过编程方式获得类型信息。是把程序外的程序集(Dll)加载进来,然后动态调用程序集里的公开属性,方法等。反射描述了在运行过程中检查和处理程序元素的过程,是一个运行库发现的过程。

    反射提供了封装程序集、模块和类型的对象(Type类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。还可以获得每个成员的名称、限定符、参数等。有了反射,即可以对每一个类型了如指掌。如果获得了构造函数信息,即可以直接创建对象,即使这个对象的类型在编译时还不知道。

//就是根据类型的元数据,动态获得类型或实例地信息
//例如,
public class MyClass
{
   public void SayHello()
   {
   }
}
现在我知道它有个方法 是SayHello,那我就可以通过反射的方式来调用该方法 。
一般情况下:
MyClass myClass = new Myclass();
myClass.SayHello();

而通过反射
MyClass myClass=new MyClass();
Type type=typeof(MyClass);
type.GetMethod("SayHello").Invoke(myClass,null);

2、程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构。

应用程序结构分为应用程序域—程序集—模块—类型—成员几个层次,公共语言运行库加载器管理应用程序域,这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。

程序集包含模块,而模块包含类型,类型又包含成员,反射则提供了封装程序集、模块和类型的对象。我们可以使用反射动态地创建类型的实例,将类型绑定到现有对象或从现有对象中获取类型,然后调用类型的方法或访问其字段和属性。反射通常具有以下用途。

(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了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。

System.Reflection.Emit命名空间的类提供了一种特殊形式的反射,可以在运行时构造类型。
反射也可用于创建称为类型浏览器的应用程序,使用户能够选择类型,然后查看有关选定类型的信息。
此外,Jscript等语言编译器使用反射来构造符号表。System.Runtime.Serialization命名空间中的类使用反射来访问数据并确定要永久保存的字段,System.Runtime.Remoting命名空间中的类通过序列化来间接地使用反射。


参考:
http://blog.csdn.net/helloguonan/article/details/5912523 

本文出自 “Ricky's Blog” 博客,请务必保留此出处http://57388.blog.51cto.com/47388/1655189

30. C# -- 反射(2)

标签:c#   反射   dll   

原文地址:http://57388.blog.51cto.com/47388/1655189

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!