一、C#中反射理解
反射是一种机制,通过这种机制可以知道一个未知类型的类型信息。
有一个对象,它不是我们定义的,既可能是通过网络捕捉到的,也可能是使用泛型定义的,但我们想知道这个对象的类型信息,想知道这个对象有哪些方法或者属性什么的,甚至想进一步调用这个对象的方法。关键是现在只知道它是一个对象,不知道它的类型,自然不会知道它有哪些方法等信息,这时该怎么办呢?
反射机制就是解决这么一个问题的,通过反射机制就可以知道未知类型对象的类型信息。
反射提供了封装程序集、模块和类型的对象(Type类型),可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。
归纳起来,反射在下列情况下很有用:
1. Type类
System.Reflection是反射的命名空间,而Type类为System.Reflection功能的根,也是访问元数据的主要方式。Type类表示类型声明,包括类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开放或封闭构造的泛型类型。
公共属性 | 说明 |
sAbstract | 获取一个值,通过该值指示Type是否为抽象的并且必须被重写 |
IsArray | 获取一个值,通过该值指示Type是否为数组 |
IsByRef | 获取一个值,通过该值指示Type是否由引用传递 |
sClass | 获取一个值,通过该值指示Type是否是一个类,即不是值类型或接口 |
IsInterface | 获取一个值,通过该值指示Type是否为接口,即不是类或值类型 |
IsSubclassOf | 确定当前Type表示的类是否是从指定的Type表示的类派生的 |
MakeArrayType | 返回一个表示当前类型的一维数组(下限为零)的Type对象 |
Module | 获取在其中定义当前Type的模块 |
Name | 获取当前成员的名称 |
Namespace | 获取Type的命名空间 |
ReflectedType | 获取用于获取该成员的类对象 |
2、方法
记得在基地时候这样做的
归纳起来,得到一个Type实例的三种方法如下:
(1)使用System.Object.GetType(),例如:
Person pe=new Person(); //定义pe为person类的一个对象
Type t=pe.GetType();
这样t为pe的Type对象。
(2)使用System.Type.GetType()静态方法,参数为类型的完全限定名。例如:
Type t=Type.GetType("MyNs.Person");
其中,MyNs.Person为MyNs命名空间中的Person类,这样t为该类的Type对象。
(3)使用typeof运算符,例如:
Type t=typeof(Person);
其中Person为一个类,这样t为该类的Type对象。
2. System.Reflection反射命名空间
System.Reflection反射命名空间包含提供加载类型、方法和字段的有组织的视图的类和接口,具有动态创建和调用类型的功能。其中主要的类及其功能如下:
补充:以前我们必须知道一个类的完整定义,才可以使用这个类。采用反射技术: