.net reflection的一点研究

反射相关的命名空间(我们就是通过这几个命名空间访问反射信息):

System.Reflection.MemberInfo

System.Reflection.EventInfo

System.Reflection.FieldInfo

System.Reflection.MethodBase

System.Reflection.ConstructorInfo

System.Reflection.MethodInfo

System.Reflection.PropertyInfo

System.Type

System.Reflection.Assembly

反射的作用:

1、可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型

2、应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。

3、反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。

 

应用要点:

1、现实应用程序中很少有应用程序需要使用反射类型

2、使用反射动态绑定需要牺牲性能

3、有些元数据信息是不能通过反射获取的

4、某些反射类型是专门为那些clr 开发编译器的开发使用的,所以你要意识到不是所有的反射类型都是适合每个人的。

应用场景:

反射appdomain程序集

反射单个程序集

利用反射获取类型信息

获取成员信息

利用反射创建实例

可以通过下面的几个方法实现:

1、System.Activator 的CreateInstance方法。该方法返回新对象的引用。具体使用方法参见msnd

2、System.Activator 的createInstanceFrom 与上一个方法类似,不过需要指定类型及其程序集

3、System.Appdomain 的方法:createInstance,CreateInstanceAndUnwrap,CreateInstranceFrom和CreateInstraceFromAndUnwrap

4、System.type的InvokeMember实例方法:这个方法返回一个与传入参数相符的构造函数,并构造该类型。

5、System.reflection.constructinfo 的Invoke实例方法

反射类型接口

           GetInterfaces/GetInterface/FindInterfaces

 

动态创建委托

System.Delegate提供了一些静态方法来动态创建一个委托,比如一个委托

//获取类型,实际上这里也可以直接用typeof来获取类型

Type   t   =   Type.GetType(TestSpace.TestClass);

//创建代理,传入类型、创建代理的对象以及方法名称

TestDelegate   method   =   (TestDelegate)Delegate.CreateDelegate(t,obj,GetValue);

 

.net反射实现的背后少不了IL元数据

所谓元数据:元数据用于描述公共语言运行库 (CLR) 在 JIT 编译 Microsoft 中间语言 (MSIL)、加载类、执行代码以及与 COM 传统型或本机领域进行交互时使用的运行库类型(类、接口和值类型)、字段、方法以及内部实现和布局信息。元数据包括在每个 CLR 组件中,并可供运行库、工具和服务使用。

.net编译之后,类型信息将以元数据的形式保存在PE格式文件中,反射就是通过元数据实现

http://msdn.microsoft.com/zh-cn/library/ms404430(v=VS.85).aspx

可以查看《你必须知道的.net

利用ilasm.exe可以查看相应的程序集元数据

新版本的.net framework提供如下命名空间

The classes of the System.Reflection.Emit namespace provide a specialized form of reflection that enables you to build types at run time.

http://msdn.microsoft.com/en-us/library/f7ykdhsy(v=VS.71).aspx

posted @ 2012-02-06 23:46  Yarkin  阅读(686)  评论(0编辑  收藏  举报