声明:本文最初是本人写在51CTO的一篇学习笔记,原文地址:http://kestrelsaga.blog.51cto.com/3015222/612118
反射的作用:
1. 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型;
2. 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射;
3. 反射主要应用于类库,这些类库需要知道一个类型的定义,以便提供更多的功能。 应用要点: 1. 现实应用程序中很少有应用程序需要使用反射类型 2. 使用反射动态绑定需要牺牲性能 3. 有些元数据信息是不能通过反射获取的 4. 某些反射类型是专门为那些clr 开发编译器的开发使用的,所以你要意识到不是所有的反射类型都是适合每个人的
反射机制调用的步骤
反射相关的命名空间System.reflection,常用的类有Assembly、MemberInfo、EventInfo、MethodInfo 、ConstructorInfo 、PropertyInfo、System.Type
1 加载程序集
2 获取类的类型
3 创建该类的实例
4 调用该实例的方法
详细见下面解说:
1、加载程序集
System.Reflection.Assembly类有两个静态方法:
Assembly.Load(string assemblyname)
Assembly.LoadFrom(string filename)
备注:
这两个方法把程序集加载到应用程序域中。
通常应用程序集名称是一个不包含扩展名的文件名。例如,TestApp.exe和BusinessObjectLibrary.dll的程序集名称分别是TestApp和BusinessObject。
如果希望CLR根据指定的程序集名称找到程序集,应该使用Assembly.Load()方法。但是如果该程序集被强命名(strongly named),你必须同时提供程序集名称和公钥(public key token),以向CLR说明你的意图是:首先试图从GAC(Global Assembly Cache,全局程序集缓存)加载程序集,如果失败,继续在应用所在目录和私有路径目录中寻找并且加载程序集.
另一种加载程序集的途径是通过Assembly.LoadFrom(string filename)。如果你希望加载的程序集超出了CLR的预定探查范围,你可以用这种办法直接从一个文件位置加载程序集。
2、获取类的类型
Type objType = assm.GetType (“TestApp.BusinessObject”);,
■ System.Type与反射相关的常用方法.
GetMethod 获取当前 Type 的特定方法。
GetMethods 获取当前 Type 的方法。
GetProperties 获取当前 Type 的属性 (Property)。
GetProperty 获取当前 Type 的特定属性 (Property)。
GetInterface 获取由当前 Type 实现或继承的特定接口。
GetInterfaceMap返回指定接口类型的接口映射。
GetInterfaces当在派生类中重写时,获取由当前 Type 实现或继承的所有接口。
GetEvent 获取由当前 Type 声明或继承的特定事件。
GetEvents 获取由当前 Type 声明或继承的事件。
InvokeMember 调用当前 Type 的特定成员。
备注:
它返回程序集(本例即assm)中的类类型信息。GetType()方法会重载(overload) 多次。在这个例子中,希望用指定类型名创建一个Type对象,该指定类型名采用命名空间加上类名的形式(如果此类在GAC中,你还必须提供公钥,而版本号为可选参数,可根据情况决定是否提供)。从代表BusinessObject类的Type实例objType中,你能得到很多有用的信息,例如objType.GetMethods()返回BusinessObject类中所有方法的信息,而objType.GetProperties()返回所有属性的信息。
3、创建类的实例
object objInstance = System.Activator.CreateInstance(objType);
4、调用该实例的方法
MethodInfo miEx = objType.GetMethod("DoWork");
miEx.Invoke(objInstance, null);
备注:
最后一步是调用DoWork()方法。miEx.Invoke和bo.DoWork()(BusinessObject bo =new BusinessObject(); bo.DoWork();)完成同样的工作。 MethodInfo.Invoke()方法支持object[]类型的参数,它代表目标方法的输入参数数组。