.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