.NET 中的反射

System.Reflection 命名空间中的类与 System.Type 使你能够获取有关加载的程序集和其中定义的类型的信息,如接口和值类型(即结构枚举)。 可以使用反射在运行时创建、调用和访问类型实例。 有关反射的特定方面的主题,请参见本概述末的相关主题

公共语言运行时加载程序管理应用程序域,应用程序域构成具有相同应用程序范围的对象周围定义的边界。 此管理包括将每个程序集加载到相应的应用程序域中和控制每个程序集内的类型层次结构的内存布局。

程序集包含模块、模块包含类型,而类型包含成员。 反射提供封装程序集、模块和类型的对象。 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。 然后,可以调用类型的方法或访问其字段和属性。 反射的典型用法如下所示:

  • 使用 Assembly 来定义和加载程序集,加载程序集清单中列出的模块,以及在此程序集中定位一个类型并创建一个它的实例。

  • 使用 Module 发现信息,如包含模块的程序集和模块中的类。 还可以获取所有全局方法或模块上定义的其它特定的非全局方法。

  • 使用 ConstructorInfo 发现信息,如名称、参数、访问修饰符(如 publicprivate)和构造函数的实现详细信息(如 abstractvirtual)。 使用 TypeGetConstructorsGetConstructor 方法来调用特定构造函数。

  • 使用 MethodInfo 发现信息,如名称、返回类型、参数、访问修饰符(如 publicprivate)和方法的实现详细信息(如 abstractvirtual)。 使用 TypeGetMethodsGetMethod 方法来调用特定方法。

  • 使用 FieldInfo 发现信息,如名称、访问修饰符(如 publicprivate)和一个字段的实现详细信息 (如 static);并获取或设置字段值。

  • 使用 EventInfo 发现信息(如名称、事件处理程序的数据类型、自定义特性、声明类型以及事件的反射的类型),并添加或删除事件处理程序。

  • 使用 PropertyInfo 发现信息(如名称、数据类型、声明类型,反射的类型和属性的只读或可写状态),并获取或设置属性值。

  • 使用 ParameterInfo 发现信息,如参数的名称、数据类型、参数是输入参数还是输出参数以及参数在方法签名中的位置。

  • 使用 CustomAttributeData 在于应用程序域的仅反射上下文中工作时发现有关自定义特性的信息。 CustomAttributeData 使你能够检查特性,而无需创建它们的实例。 System.Reflection.Emit 命名空间的类提供一种专用形式的反射,使你能够在运行时生成类型。

还可以使用反射来创建称为类型浏览器的应用程序,它使用户能够选择类型,然后查看有关这些类型的信息。

反射还有其它用途。 JScript 等语言的编译器使用反射来构造符号表。 System.Runtime.Serialization 命名空间中的类使用反射来访问数据并确定要保存哪些字段。 System.Runtime.Remoting 命名空间中的类通过序列化间接使用反射。

反射中的运行时类型

反射提供类(如 TypeMethodInfo),用于表示类型、成员、参数和其它代码实体。 但使用反射时,你并不直接使用这些类,其中大部分类均是抽象的(Visual Basic 中为 MustInherit)。 相反,你使用由公共语言运行时 (CLR) 提供的类型。

例如,使用 C# typeof 运算符(Visual Basic 中为 GetType)获取 Type 对象时,该对象实际上是 RuntimeTypeRuntimeType 派生自 Type,并提供所有抽象方法的实现。

这些运行时类是 internal(Visual Basic 中为 Friend)。 它们没有与其基类分开记录,因为它们的行为由基类文档来描述。

Title 说明
查看类型信息 介绍 Type 类,并提供演示如何使用具有几个反射类的 Type 来获取有关构造函数、方法、字段、属性和事件的信息的代码示例。
反射类型和泛型类型 说明反射如何处理泛型类型和泛型方法的类型参数和类型自变量。
反射的安全注意事项 描述确定可以在何种程度上使用反射来发现类型信息和访问类型的规则。
动态加载和使用类型 描述支持后期绑定的反射自定义绑定接口。
如何:将程序集加载到仅反射上下文中 描述仅反射的加载上下文。 显示如何加载程序集、如何测试上下文以及如何检查应用到仅反射上下文中的程序集。
如何:使用 MetadataLoadContext 检查程序集内容 使用 MetadataLoadContext 加载和检查程序集。
访问自定义特性 演示如何使用反射来查询特性的存在和值。
指定完全限定的类型名称 描述 Backus-Naur 形式 (BNF) 的完全限定类型名称的格式,以及指定特殊字符、程序集名称、指针、引用和数组所需的语法。
如何:使用反射挂接委托 说明如何创建方法的委托并将委托挂钩到事件。 说明如何使用 DynamicMethod 在运行时创建事件处理方法。
发出动态方法和程序集 说明如何生成动态程序集和动态方法。

参考