Отражение в .NETReflection in .NET

Классы в пространстве имен System.Reflection вместе с System.Type позволяют получить информацию о загруженных сборках и типах, определенных в них, таких как классы, интерфейсы и типы значений.The classes in the System.Reflection namespace, together with System.Type, enable you to obtain information about loaded assemblies and the types defined within them, such as classes, interfaces, and value types. Отражение можно также использовать для создания экземпляров типов во время выполнения, для вызова этих экземпляров и получения доступа к ним.You can also use reflection to create type instances at run time, and to invoke and access them. Разделы, в которых описываются отдельные аспекты отражения, можно найти в подразделе Связанные подразделы в конце этого обзора.For topics about specific aspects of reflection, see Related Topics at the end of this overview.

Загрузчик среды CLR управляет доменами приложений, которые образуют определенные границы вокруг объектов с одной и той же областью приложения.The common language runtime loader manages application domains, which constitute defined boundaries around objects that have the same application scope. В частности, он загружает каждую сборку в соответствующий домен приложения и контролирует распределение памяти для иерархии типов в каждой сборке.This management includes loading each assembly into the appropriate application domain and controlling the memory layout of the type hierarchy within each assembly.

Сборки содержат модули, модули содержат типы, а типы содержат члены.Assemblies contain modules, modules contain types, and types contain members. Отражение предоставляет объекты, которые инкапсулируют сборки, модули и типы.Reflection provides objects that encapsulate assemblies, modules, and types. Отражение можно использовать для динамического создания экземпляра типа, привязки типа к существующему объекту или получения типа из существующего объекта.You can use reflection to dynamically create an instance of a type, bind the type to an existing object, or get the type from an existing object. Затем можно вызывать методы типа или получать доступ к его полям и свойствам.You can then invoke the type's methods or access its fields and properties. Ниже приведены типичные варианты использования отражения.Typical uses of reflection include the following:

  • Объект Assembly используется для определения и загрузки сборок, загрузки модулей, перечисленных в манифесте сборки, а также для поиска типа в сборке и создания его экземпляра.Use Assembly to define and load assemblies, load modules that are listed in the assembly manifest, and locate a type from this assembly and create an instance of it.

  • Объект Module используется для получения таких сведений, как имя сборки, содержащей модуль, и перечень классов этого модуля.Use Module to discover information such as the assembly that contains the module and the classes in the module. Кроме того, можно получить все глобальные методы или определенные неглобальные методы, включенные в модуль.You can also get all global methods or other specific, nonglobal methods defined on the module.

  • Объект ConstructorInfo используется для получения таких сведений, как имя, параметры, модификаторы доступа (например, public или private) и сведения о реализации (например, abstract или virtual) конструктора.Use ConstructorInfo to discover information such as the name, parameters, access modifiers (such as public or private), and implementation details (such as abstract or virtual) of a constructor. Метод GetConstructors или GetConstructor типа Type используется для вызова конкретного конструктора.Use the GetConstructors or GetConstructor method of a Type to invoke a specific constructor.

  • Класс MethodInfo используется для получения таких сведений, как имя, возвращаемый тип, параметры, модификаторы доступа (например, public или private) и сведения о реализации (например, abstract или virtual) метода.Use MethodInfo to discover information such as the name, return type, parameters, access modifiers (such as public or private), and implementation details (such as abstract or virtual) of a method. Метод GetMethods или GetMethod типа Type используется для вызова определенного метода.Use the GetMethods or GetMethod method of a Type to invoke a specific method.

  • Класс FieldInfo используется для получения таких сведений, как имя, модификаторы доступа (например, public или private) и сведения о реализации (например, static) поля, а также для получения или задания значений поля.Use FieldInfo to discover information such as the name, access modifiers (such as public or private) and implementation details (such as static) of a field, and to get or set field values.

  • Класс EventInfo используется для получения таких сведений, как имя, тип данных обработчика событий, пользовательские атрибуты, объявляющий тип и отраженный тип события, а также для добавления или удаления обработчиков событий.Use EventInfo to discover information such as the name, event-handler data type, custom attributes, declaring type, and reflected type of an event, and to add or remove event handlers.

  • Класс PropertyInfo используется для получения таких сведений, как имя, тип данных, объявляющий тип, отраженный тип и состояние доступности свойства (для записи или только для чтения), а также для получения и задания значений свойств.Use PropertyInfo to discover information such as the name, data type, declaring type, reflected type, and read-only or writable status of a property, and to get or set property values.

  • Класс ParameterInfo используется для получения таких сведений, как имя параметра, тип данных, вид параметра (входной или выходной) и его положение в подписи метода.Use ParameterInfo to discover information such as a parameter's name, data type, whether a parameter is an input or output parameter, and the position of the parameter in a method signature.

  • Класс CustomAttributeData используется для получения сведений о настраиваемых атрибутах при работе в контексте домена приложения только для отражения.Use CustomAttributeData to discover information about custom attributes when you are working in the reflection-only context of an application domain. Класс CustomAttributeData позволяет проверять атрибуты, не создавая их экземпляры.CustomAttributeData allows you to examine attributes without creating instances of them.

Классы пространства имен System.Reflection.Emit реализуют особый вид отражения, который позволяет создавать типы во время выполнения.The classes of the System.Reflection.Emit namespace provide a specialized form of reflection that enables you to build types at run time.

Отражение также можно использовать для создания приложений, называемых браузерами типов, которые позволяют пользователям выбирать типы, а затем просматривать сведения о них.Reflection can also be used to create applications called type browsers, which enable users to select types and then view the information about those types.

Есть и другие способы использования отражения.There are other uses for reflection. Компиляторы таких языков программирования, как JScript, используют отражение для построения таблиц символов.Compilers for languages such as JScript use reflection to construct symbol tables. Классы в пространстве имен System.Runtime.Serialization используют отражение для доступа к данным и определения того, какие поля следует сохранить.The classes in the System.Runtime.Serialization namespace use reflection to access data and to determine which fields to persist. Классы в пространстве имен System.Runtime.Remoting используют отражение косвенным образом через сериализацию.The classes in the System.Runtime.Remoting namespace use reflection indirectly through serialization.

Типы среды выполнения в отраженииRuntime Types in Reflection

Отражение предоставляет классы, такие как Type и MethodInfo, для представления типов, членов, параметров и других объектов кода.Reflection provides classes, such as Type and MethodInfo, to represent types, members, parameters, and other code entities. Однако при использовании отражения вы работаете с этими классами не напрямую: большинство из них являются абстрактными (MustInherit в Visual Basic).However, when you use reflection, you don't work directly with these classes, most of which are abstract (MustInherit in Visual Basic). Вместо этого вы работаете с типами, предоставленными средой CLR.Instead, you work with types provided by the common language runtime (CLR).

Например, при использовании оператора typeof в C# (GetType в Visual Basic) для получения объекта Type объект фактически является RuntimeType.For example, when you use the C# typeof operator (GetType in Visual Basic) to obtain a Type object, the object is really a RuntimeType. RuntimeType является производным от Type и предоставляет реализации всех абстрактных методов.RuntimeType derives from Type and provides implementations of all the abstract methods.

Эти классы среды выполнения являются internal (Friend в Visual Basic).These runtime classes are internal (Friend in Visual Basic). Они не документируются отдельно от своих базовых классов, так как их поведение описывается в документации базового класса.They are not documented separately from their base classes, because their behavior is described by the base class documentation.

ЗаголовокTitle ОписаниеDescription
Просмотр сведений о типахViewing Type Information Описывается класс Type и приводятся примеры кода, иллюстрирующие использование Type с несколькими классами отражения для получения информации о конструкторах, методах, полях, свойствах и событиях.Describes the Type class and provides code examples that illustrate how to use Type with several reflection classes to obtain information about constructors, methods, fields, properties, and events.
Отражение и универсальные типыReflection and Generic Types Объясняется обработка отражением параметров и аргументов типа для универсальных типов и методов.Explains how reflection handles the type parameters and type arguments of generic types and generic methods.
Соображения о безопасности для отраженияSecurity Considerations for Reflection Описываются правила, определяющие, в какой степени отражение можно использовать для получения информации о типах и доступа к типам.Describes the rules that determine to what degree reflection can be used to discover type information and access types.
Динамическая загрузка и использование типовDynamically Loading and Using Types Описывается интерфейс настраиваемой привязки отражения, поддерживающий позднее связывание.Describes the reflection custom-binding interface that supports late binding.
Практическое руководство. Загрузка сборок в контекст, предназначенный только для отраженияHow to: Load Assemblies into the Reflection-Only Context Описывается контекст загрузки, предназначенный только для отражения.Describes the reflection-only load context. Показано, как загрузить сборку, протестировать контекст и просмотреть атрибуты, примененные к сборке в контексте, предназначенном только для отражения.Shows how to load an assembly, how to test the context, and how to examine attributes applied to an assembly in the reflection-only context.
Доступ к пользовательским атрибутамAccessing Custom Attributes Показано, как использовать отражение для проверки наличия атрибутов и получения их значений.Demonstrates using reflection to query attribute existence and values.
Указание полных имен типовSpecifying Fully Qualified Type Names Описывается формат полных имен типов в форме Бэкуса-Наура и синтаксис для указания специальных символов, имен сборок, указателей, ссылок и массивов.Describes the format of fully qualified type names in terms of the Backus-Naur form (BNF), and the syntax required for specifying special characters, assembly names, pointers, references, and arrays.
Практическое руководство. Подключение делегата с помощью отраженияHow to: Hook Up a Delegate Using Reflection Объясняется, как создать делегат для метода и привязать его к событию.Explains how to create a delegate for a method and hook the delegate up to an event. Также объясняется, как создать метод обработки событий во время выполнения с помощью DynamicMethod.Explains how to create an event-handling method at run time using DynamicMethod.
Предоставление динамических методов и сборокEmitting Dynamic Methods and Assemblies Объясняется, как создавать динамические сборки и динамические методы.Explains how to generate dynamic assemblies and dynamic methods.

СправочникиReference

System.Type

System.Reflection

System.Reflection.Emit