一直以来对反射比较感兴趣,最近工作没那么紧张,所以学了一下反射的入门知识。
一、对反射的理解。
反射,说的通俗一点来讲,就是给某些类、程序集(dll之类)拍个X光,或者做个B超,做完之后,它里面有啥东西,长什么样,状态如何啥都清楚了。那么这个拍X光或者做B超的机器是什么呢?其实,这些机器就是System.Type类里的各种函数,比如GetMethod()之类的,通过这些函数,你可以获取到目标内包含的所有成员字段、属性、方法、事件、委托以及他们自身的相关信息比如类型、访问修饰符、参数信息等等,一切都能获取到。所以,System.Type类是反射的核心东西。
二、反射有什么用。
1、方便了解目标,从而更好更正确的使用其中的各种属性方法等,此点不细述。
2、动态调用,提供事件、方法的用户定制,增强软件系统的可扩展性,这是主要针对方法(函数)来讲的,其实类似于函数的指针或者说C#中的委托,或者说PHP中所谓的“变量的变量($$name)”,都是留一个固定调用的接口,让开发者(用户)给接口定制不同的方法,从而提高扩展性。
三、如何用反射。
1、首先要引入反射相关的命名空间(using System.Type;using System.Reflections;using System.Reflections.Assembly;)
2、根据你的需求,将目标转换成Type基类(GetType(目标类)、目标类的实例.GetType()、TypeOf(目标类的实例)),如果是从外部load进来的程序集(Assembly dll = Assembly.LoadFile(path);Type tmp=dll.GetType("",bool);..)。之后利用这个Type类中的各种GetXXX(s)方法,来取得相应的信息。必要时,可以写一个各种信息的集合管理类,其中保存这个类的各种信息。
3、如有动态调用的需求,可以先用GetMethod()方法获取想要的方法(得到的是methodinfo类型的数据),再定义一个事件和一个或多个内部调用这些方法的方法,并将定义的新方法注册到这个事件中。如果只是想调用这个方法,那么用MethodInfo类下的Invoke(object,object[])即可调用。其中第一个参数是方法所属的类的实例,第二个参数是方法的参数数组。当该方法是静态方法时,第一个参数可以指定为null,否则应指定一个相应类型的实例(如果不是继承自monobehaviour,可以new classname(),最好指定最适合的实例,否则可能会有副作用)。
四、参考文章
详解C#中的反射(http://blog.csdn.net/educast/article/details/2894892)
.NET简谈反射(动态调用)(http://wangqingpei557.blog.51cto.com/1009349/606400/)