Поделиться через


Отражение в .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, чтобы обнаружить информацию о пользовательских атрибутах при работе в контексте только для отражения (.NET Framework). CustomAttributeData позволяет проверять атрибуты без создания экземпляров.

Классы System.Reflection.Emit пространства имен предоставляют специализированную форму отражения, которая позволяет создавать типы во время выполнения.

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

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

Типы времени выполнения в рефлексии

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

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

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

Справка