反射

通过 System.Reflection 命名空间中的类以及 System.Type,您可以获取有关已加载的程序集和在其中定义的类型(如接口值类型)的信息。 您也可以使用反射在运行时创建类型实例,以及调用和访问这些实例。 有关反射的特定方面的主题,请参见本概述末尾的相关主题。

公共语言运行时加载器管理应用程序域,这些域在拥有相同应用程序范围的对象周围形成了确定边界。 这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。

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

  • 使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。

  • 使用 Module 发现以下信息:包含模块的程序集以及模块中的类等。 您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

  • 使用 ConstructorInfo 发现以下信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。 使用 TypeGetConstructorsGetConstructor 方法来调用特定的构造函数。

  • 使用 MethodInfo 发现以下信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。 使用 TypeGetMethodsGetMethod 方法来调用特定的方法。

  • 使用 FieldInfo 发现以下信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如 static)等;并获取或设置字段值。

  • 使用 EventInfo 发现以下信息:事件的名称、事件处理程序数据类型、自定义特性、声明类型和反射类型等;并添加或移除事件处理程序。

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

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

  • 当您在一个应用程序域的仅反射上下文中工作时,请使用 CustomAttributeData 来发现有关自定义特性的信息。 通过使用 CustomAttributeData,您不必创建特性的实例就可以检查它们。

System.Reflection.Emit 命名空间的类提供了一种特殊形式的反射,使您能够在运行时生成类型。

反射也可用于创建称作类型浏览器的应用程序,它使用户能够选择类型,然后查看有关选定类型的信息。

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

相关主题

标题

说明

反射中的运行时类型

描述内部类型(如 RuntimeType),这些类型继承 System.Reflection 命名空间中的抽象类并提供了这些抽象类的大部分实现。

查看类型信息

描述 Type 类并提供代码示例,这些代码示例演示如何使用 Type 和若干反射类获取有关构造函数、方法、字段、属性和事件的信息。

反射类型和泛型类型

说明反射如何处理泛型类型和泛型方法的类型参数和类型变量。

反射类所使用的设计模式

提供一个表,说明方法命名模式和最常用的反射类(如 ModuleTypeMemberInfo 类)的用法。

反射的安全注意事项

描述用于确定反射是否适合用于了解类型信息和访问类型的规则。

动态加载和使用类型

描述支持后期绑定的反射自定义绑定接口。

如何:将程序集加载到仅反射上下文中

介绍只反射加载上下文。 演示如何加载程序集、如何测试上下文以及如何检查应用于只反射上下文中的程序集的特性。

访问默认成员

说明如何使用反射来访问类可能具有的默认成员。

访问默认参数值

说明如何使用反射来访问具有默认值的参数以及如何调用包含具有默认值的参数的方法。

访问自定义特性

说明如何使用反射来查询特性是否存在以及特性值。

指定完全限定的类型名称

按照巴科斯范氏 (Backus-Naur form) (BNF) 来描述完全限定类型名称的格式,并描述在指定特殊字符、程序集名称、指针、引用和数组时所需的语法。

非托管反射 API

介绍在哪里可以找到有关使用非托管反射来检查元数据的信息。

如何:使用反射将委托挂钩

说明如何为方法创建委托,并将委托挂钩到事件。 说明如何使用 DynamicMethod 在运行时创建事件处理方法。

发出动态方法和程序集

说明如何生成动态程序集和动态方法。

参考

System.Type

System.Reflection

System.Reflection.Emit

返回页首