反射初识
反射是一种宽泛的叫法,
它通过System.Reflection命名空间并配合System.Type类,提供了在运行时对类型和类型成员的元数据(metadata)的访问能力。
反射的核心是Type类.
反射的作用
- 查看和遍历类型和类型成员的元数据
- 动态创建类型实例,动态调用所创建的实例的方法、字段、属性
- 迟绑定(Late-Binding)方法和属性
这个类封装了关于类型的元数据,也是进行反射的入口
当获得了类型的Type对象后,就可以根据Type提供的属性和方法获取这个类型的一切信息,包
括方法、字段、属性、事件、参数、构造函数等。
获取已加载程序集中类型的Type对象的方法:
- 使用Type类提供的静态方法GetType()
- 使用typeof操作符
- 通过类型实例获得Type对象
// 1 使用Type.GetType()
Type t1 = Type.GetType("System.IO.Stream");
Console.WriteLine(t1.ToString());
// 2 使用 typeof 操作符
Type t2 = typeof(System.IO.Stream);
// 3 通过类型实例获得Type对象
string name = "JayjzChen";
Type t3 = name.GetType();
Type封装了哪些类型信息
Type t = demo.GetType();
demo类型的基本信息
- demo是什么类型. 也就是demo类型名称.
- 该类型在什么命名空间下.
- 它的基本类型是什么. 以及在 .NET 运行库中的映射类型是什么?
- 它是值类型还是引用类型.
- 它的可访问性是那种? public private protected
- 它是枚举. 类. 数组. 还是 接口?
- 它是不是基本类型(int等)?
demo的类型的成员信息
-
包含哪些字段. 字段名称. 类型. 可访问性.
-
哪些属性. 属性名称. 类型. 可访问性.
-
包含哪些构造函数,构造函数的名称,构造函数的参数个数、参数类型、参数名称
-
包含哪些方法,方法的名称,方法的返回值类型,方法的参数个数、参数类型、参数
名称 -
包含哪些事件,事件的名称
-
实现了哪些接口
PropertyInfo类型,封装了类型的属性信息
ConstructorInfo类型,封装了类型的构造函数信息
MethodInfo类型,封装了类型的方法信息
EventInfo类型,封装了类型的事件信息
ParameterInfo类型,封装了方法和构造函数的参数信息
注意到Type类型,以及所有以Info结尾的类型均继承自System.Reflection.MemberInfo类型,MemberInfo类型提供了获取类型基础信息的能力。
反射程序集 Assembly类型
System.Reflection命名空间下的Assembly类型,代表了一个程序集,并包含了关于程序集的信息
获取Assembly对象有很多种方法,可以使用Assembly类型提供的静态方法LoadFrom()\或Load()
Assembly asm = Assembly.LoadFrom("Demo.dll");
//
Assembly asm = Assembly.Load("Demo");