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

Классы в пространстве имен System.Reflection вместе с System.Type позволяют получить информацию о загруженных сборках и типах, определенных в них, таких как классы, интерфейсы и типы значений (т. е. структуры и перечисления). Отражение можно также использовать для создания экземпляров типов во время выполнения, для вызова этих экземпляров и получения доступа к ним. Разделы, в которых описываются отдельные аспекты отражения, можно найти в подразделе Связанные подразделы в конце этого обзора.

Загрузчик среды CLR управляет доменами приложений, которые образуют определенные границы вокруг объектов с одной и той же областью приложения. В частности, он загружает каждую сборку в соответствующий домен приложения и контролирует распределение памяти для иерархии типов в каждой сборке.

Сборки содержат модули, модули содержат типы, а типы содержат члены. Отражение предоставляет объекты, которые инкапсулируют сборки, модули и типы. Отражение можно использовать для динамического создания экземпляра типа, привязки типа к существующему объекту или получения типа из существующего объекта. Затем можно вызывать методы типа или получать доступ к его полям и свойствам. Ниже приведены типичные варианты использования отражения.

  • Объект Assembly используется для определения и загрузки сборок, загрузки модулей, перечисленных в манифесте сборки, а также для поиска типа в сборке и создания его экземпляра.

  • Объект Module используется для получения таких сведений, как имя сборки, содержащей модуль, и перечень классов этого модуля. Кроме того, можно получить все глобальные методы или определенные неглобальные методы, включенные в модуль.

  • Объект ConstructorInfo используется для получения таких сведений, как имя, параметры, модификаторы доступа (например, public или private) и сведения о реализации (например, abstract или virtual) конструктора. Метод GetConstructors или GetConstructor типа Type используется для вызова конкретного конструктора.

  • Класс MethodInfo используется для получения таких сведений, как имя, возвращаемый тип, параметры, модификаторы доступа (например, public или private) и сведения о реализации (например, abstract или virtual) метода. Метод GetMethods или GetMethod типа Type используется для вызова определенного метода.

  • Класс FieldInfo используется для получения таких сведений, как имя, модификаторы доступа (например, public или private) и сведения о реализации (например, static) поля, а также для получения или задания значений поля.

  • Класс EventInfo используется для получения таких сведений, как имя, тип данных обработчика событий, пользовательские атрибуты, объявляющий тип и отраженный тип события, а также для добавления или удаления обработчиков событий.

  • Класс PropertyInfo используется для получения таких сведений, как имя, тип данных, объявляющий тип, отраженный тип и состояние доступности свойства (для записи или только для чтения), а также для получения и задания значений свойств.

  • Класс ParameterInfo используется для получения таких сведений, как имя параметра, тип данных, вид параметра (входной или выходной) и его положение в подписи метода.

  • Класс CustomAttributeData используется для получения сведений о настраиваемых атрибутах при работе в контексте домена приложения только для отражения. Класс CustomAttributeData позволяет проверять атрибуты, не создавая их экземпляры. Классы пространства имен System.Reflection.Emit реализуют особый вид отражения, который позволяет создавать типы во время выполнения.

Отражение также можно использовать для создания приложений, называемых браузерами типов, которые позволяют пользователям выбирать типы, а затем просматривать сведения о них.

Есть и другие способы использования отражения. Компиляторы таких языков программирования, как JScript, используют отражение для построения таблиц символов. Классы в пространстве имен System.Runtime.Serialization используют отражение для доступа к данным и определения того, какие поля следует сохранить. Классы в пространстве имен System.Runtime.Remoting используют отражение косвенным образом через сериализацию.

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

Отражение предоставляет классы, такие как Type и MethodInfo, для представления типов, членов, параметров и других объектов кода. Однако при использовании отражения вы работаете с этими классами не напрямую: большинство из них являются абстрактными (MustInherit в Visual Basic). Вместо этого вы работаете с типами, предоставленными средой CLR.

Например, при использовании оператора typeof в C# (GetType в Visual Basic) для получения объекта Type объект фактически является RuntimeType. RuntimeType является производным от Type и предоставляет реализации всех абстрактных методов.

Эти классы среды выполнения являются internal (Friend в Visual Basic). Они не документируются отдельно от своих базовых классов, так как их поведение описывается в документации базового класса.

Заголовок Описание
Просмотр сведений о типах Описывается класс Type и приводятся примеры кода, иллюстрирующие использование Type с несколькими классами отражения для получения информации о конструкторах, методах, полях, свойствах и событиях.
Отражение и универсальные типы Объясняется обработка отражением параметров и аргументов типа для универсальных типов и методов.
Соображения о безопасности для отражения Описываются правила, определяющие, в какой степени отражение можно использовать для получения информации о типах и доступа к типам.
Динамическая загрузка и использование типов Описывается интерфейс настраиваемой привязки отражения, поддерживающий позднее связывание.
Практическое руководство. Загрузка сборок в контекст, предназначенный только для отражения Описывается контекст загрузки, предназначенный только для отражения. Показано, как загрузить сборку, протестировать контекст и просмотреть атрибуты, примененные к сборке в контексте, предназначенном только для отражения.
Практическое руководство. Проверка содержимого сборки с помощью MetadataLoadContext Загрузка и проверка сборок с помощью MetadataLoadContext.
Доступ к пользовательским атрибутам Показано, как использовать отражение для проверки наличия атрибутов и получения их значений.
Определение полных имен типов Описывается формат полных имен типов в форме Бэкуса-Наура и синтаксис для указания специальных символов, имен сборок, указателей, ссылок и массивов.
Практическое руководство. Подключение делегата с помощью отражения Объясняется, как создать делегат для метода и привязать его к событию. Также объясняется, как создать метод обработки событий во время выполнения с помощью DynamicMethod.
Предоставление динамических методов и сборок Объясняется, как создавать динамические сборки и динамические методы.

Справочник