反射
反射是读取程序集中的元数据,使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。
一、应用场景
反射在下列的一些场景中使用,能起到很好的作用。
1、需要访问程序元数据的属性。
2、检查和实例化程序集中的类型。
3、在运行时构建新类型。
4、执行后期绑定,访问在运行时创建的类型的方法。
二、反射使用
C#语言中反射主要基于System.Type类和System.Reflection命名空间下的一些类来实现。下表是与反射相关的类。
类名 | 描述 |
---|---|
System.Type | 可访问关于任何数据类型的信息。 |
System.AppDomain | 用于加载和执行程序集 |
System.Activator | 主要用于创建对象的实例。 |
System.Reflection.Assembly | 访问给定程序集的相关信息或把这个程序集加载到程序中。 |
System.Reflection.Module | 提供访问和操作模块的信息与功能。 |
System.Reflection.ConstructorInfo | 发现类构造函数的属性并提供对构造函数元数据的访问权限。 |
System.Reflection.ParameterInfo | 发现参数的属性并提供对参数元数据的访问权限。 |
System.Reflection.MethodInfo | 发现方法的属性并提供对方法元数据的访问权限。 |
System.Reflection.PropertyInfo | 发现属性 (Property) 的特性 (Attribute) 并提供对属性元数据的访问。 |
System.Reflection.FieldInfo | 发现字段的属性并提供对字段元数据的访问权限。 |
System.Reflection.MemberInfo | 获取有关成员属性的信息并提供对成员元数据的访问。 |
1、System.Type
通过Type类可以访问关于任何数据类型的信息,在反射中起到核心的作用。Type是一个抽象的基类,有与每种数据类型对应的派生类。通过使用这个派生类的对象的方法、字段、属性来查找有关该类型的所有信息。Type也是许多反射功能的入口 。
属性
Type提供的可用属性,都是只读的。使用这些属性可以确定数据的类型。Type 实现的属性可分下面三类。
1、与类相关的各种名称的字符串
名称 | 描述 |
---|---|
Name | 获取数据类型名。 |
FullName | 获取数据类型的完全限定名,包含名称空间,但不包括程序集。 |
Namespace | 获取定义数据类型的名称空间名。 |
2、获取Type对象的引用的属性
名称 | 描述 |
---|---|
BaseType | 获取该Type的基本类型。 |
UnderlyingSystemType | 获取该类型的公共语言运行时提供的类型。 |
ReflectedType | 获取用于获取该成员的类对象。 |