C#反射机制
反射提供了描述程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了特性,可以利用反射来访问它们。运行期得到类型信息
得到一个Type类型实例的三种方法(因为Type是一个抽象类,所以不能直接使用new关键字创建一个Type对象)
(1) 使用System.Object.GetType()
e.g: Person pe=new Person(); //---------定义pe为person类的一个对象
Type t=pe.GetType();
(2)使用System.Type.GetType()静态方法,参数为类型的完全限定名
e.g: Type t=Type.GetType("Entity.Person");
该方法被重载,允许指定两个布尔类型的参数,一个用来控制当前类型不能找到时是否抛出异常,
另一个用来指示是否区分字符串大小写
e.g:
Type t=Type.GetType("Entity.Person",false,true);
注意到传入的字符串并没有包含类型所在的程序集信息,此时该类型便被认为是定义在当前执行的程序集中的。
要得到一个外部私有程序集的类型元数据时,字符串参数必须使用类型完全限定名加上类型所在程序集的友好名字
e.g: Type t=Type.GetType("Entity.Person","Entity");//------"Entity"即为类型所在程序集的友好名字
嵌套类型:传入的字符串可以指定一个+标记来表示一个嵌套类型,如希望得到一个嵌套在person类中的枚举类型City的类型信息,
则可以这样 e.g: Type t=Type.GetType("Entity.person+City");
(3) 使用typeof运算符 e.g: Type t=typeof(person);
三种方法的比较:
使用第一种方法必须先建立一个实例,而后两种方法不必先建立实例。
但使用typeof运算符仍然需要知道类型的编译时信息,而使用System.Type.GetType()静态方法不需要知道类型的编译时信息,所以是首选方法。
http://www.cnblogs.com/binfire/archive/2013/01/17/2864887.html
http://www.cnblogs.com/tangself/archive/2010/08/26/1809066.html