.Net由浅入深说反射
概述
什么是反射
反射是.Net平台的重要机制,通过反射允许开发者在编写代码时,通过使用Type类型或dynamic关键字使编译器跳过类型检查,而是在程序执行期阶段获得程序或程序集中某个类型(包括类、结构、委托、接口和枚举等)的成员和成员的信息。这就是慢绑定或后绑定。
反射的优缺点
优点: 这样做的好处是使代码结构更加松散,降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码。
缺点:
1、性能问题:反射相当于将部分编译器的工作交给解释器做,因此运行性能比直接代码要慢。
2、使用反射容易出错:因为忽略了类型检查工作,程序员需要对要调用的类非常了解,否则很容易在运行期出错。
反射实现
.Net平台提供两种反射的实现方式,Type类型和从.Net 4.0引入的Dynamic关键字。
Type类型
首先通过声明Type对象加载被调用类,然后通过Type对象获取被调用类的成员和方法。
声明Type对象的三种方法
1.typeof()操作符
Type d=typeof(double);
- Object类的自带方法GetType(). System.Object.GetType()
double d=10;
Type d=d.GetType();
- Type类型的GetType()静态方法
Type d=Type.GetType("System.Double");
获取被调用类的方法
通过调用GetMethod或GetMethods方法将方法信息存入MethodInfo对象中。
Type d=typeof(double);
MethodInfo method=d.GetMethod("ToString");
method.Invoke(); //调用方法
Type d=typeof(double);
foreach (MethodInfo nextMethod in d.GetMethods())
{
//...
}
Type类型不仅可以返回MethodInfo获取方法,也可以返回的其它对象以获取其他类信息(成员,事件,构造等等),见如下列表
| Type对象可返回的类型 | 对应方法 |
|---|---|
| ConstructorInfo | GetConstructor, GetConstructors |
| EventInfo | GetEvent, GetEvents |
| FieldInfo | GetField, GetFields |
| MemberInfo | GetMember, GetMembers,GetDefaultMembers |
| MethodInfo | GetMethod, GetMethods |
| PropertyInfo | GetProperty, GetProperties |
Dynamic关键字
从.Net 4.0开始引入 Dynamic关键字,Dynamic对象不需要通过Invoke(),可以直接调用成员方法。这样看起来很清爽。
private static void UsingReflectionWithDynamic(string addinPath)
{
dynamic str = "a string";
dynamic result = str.Substring(2); //调用string对象的Substring(int index)方法
Console.WriteLine(result);
}
总结
任何技术都有其应用场景,使用反射的常见场景有以下两种:
- 不能明确接口调用哪个函数,需要根据传入的参数在运行时决定。
- 不能明确传入函数的参数类型,需要在运行时处理任意对象。
以上场景中,一般将被调用参数和方法写入配置文件中,通过assembly对象根据需求调用。
private static object GetCalculator()
{
Assembly assembly = Assembly.LoadFile(CalculatorLibPath);
return assembly.CreateInstance(CalculatorTypeName);
}
414



被折叠的 条评论
为什么被折叠?



