Отражение
Классы в пространстве имен 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 используют отражение косвенным путем при сериализации.
Связанные разделы
Заголовок |
Описание |
---|---|
Описание внутренних типов, таких как RuntimeType, которые наследуют абстрактные классы в пространстве имен System.Reflection и предоставляют большую часть их реализаций. |
|
Описание класса Type и предоставление примеров программного кода, иллюстрирующих использование класса Type совместно с несколькими классами отражения для получения сведений о конструкторах, методах, полях, свойствах и событиях. |
|
Объясняется обработка отражением параметров типа и аргументов типа, применимых к универсальным методам и универсальным типам. |
|
Предоставляет таблицу, в которой приведен шаблон именования методов и использования самых часто применяемых классов отражения, таких как Module, Type, и MemberInfo. |
|
Описываются правила, определяющие, в какой степени отражение может быть использовано для получения сведений о типах и доступа к типам. |
|
Описывается интерфейс пользовательской привязки на основе отражения, поддерживающий позднюю привязку. |
|
Практическое руководство. Загрузка сборок в контекст, предназначенный только для отражения |
Описание контекста загрузки, применимого только к отражениям. Показывает, как загрузить сборку, как проверить контекст и как просмотреть атрибуты, примененные к сборке в контексте, относящемся только к отражениям. |
Показано, как использовать отражение для доступа к членам по умолчанию, которые могут входить в состав класса. |
|
Показано, как использовать отражение для доступа к аргументам, имеющим значения по умолчанию, и как вызывать методы с такими аргументами. |
|
Показано, как использовать отражение для проверки наличия атрибутов и получения их значений. |
|
Описывается формат полных имен типов в форме Бэкуса-Наура (БНФ) и синтаксис для указания специальных знаков, имен сборок, указателей, ссылок и массивов. |
|
Описывается, где можно получить сведения об использовании неуправляемого отражения для просмотра метаданных. |
|
Практическое руководство. Подключение делегата с помощью отражения |
Объясняется, как создать делегат для метода и привязать его к событию. Объясняется, как создать метод обработки события во время выполнения с помощью DynamicMethod. |
Объясняет, как создавать динамические сборки и динамические методы. |
Ссылки
К началу