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

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

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

  • Объект Assembly используется для определения и загрузки сборок, загрузки модулей, перечисленных в манифесте сборки, а также для поиска типа в сборке и создания его экземпляра.
  • Объект Module используется для получения таких сведений, как имя сборки, содержащей модуль, и перечень классов этого модуля. Кроме того, можно получить все глобальные методы или определенные неглобальные методы, включенные в модуль.
  • Объект ConstructorInfo используется для получения таких сведений, как имя, параметры, модификаторы доступа (например, public или private) и сведения о реализации (например, abstract или virtual) конструктора. Метод GetConstructors или GetConstructor типа Type используется для вызова конкретного конструктора.
  • Используйте MethodInfo для обнаружения таких сведений, как имя, возвращаемый тип, параметры, модификаторы доступа и сведения о реализации (например abstract , или virtual) метода. Метод GetMethods или GetMethod типа Type используется для вызова определенного метода.
  • Используется FieldInfo для обнаружения таких сведений, как имя, модификаторы доступа и сведения о реализации (например static, поля) и получение или задание значений полей.
  • Класс EventInfo используется для получения таких сведений, как имя, тип данных обработчика событий, пользовательские атрибуты, объявляющий тип и отраженный тип события, а также для добавления или удаления обработчиков событий.
  • Класс PropertyInfo используется для получения таких сведений, как имя, тип данных, объявляющий тип, отраженный тип и состояние доступности свойства (для записи или только для чтения), а также для получения и задания значений свойств.
  • Класс ParameterInfo используется для получения таких сведений, как имя параметра, тип данных, вид параметра (входной или выходной) и его положение в подписи метода.
  • Используется CustomAttributeData для обнаружения сведений о пользовательских атрибутах при работе в MetadataLoadContext контексте только отражения (платформа .NET Framework). Класс 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). Они не документируются отдельно от своих базовых классов, так как их поведение описывается в документации базового класса.

Справочные материалы