Шрифт:
Подобно любому другому пространству имен, System.Reflection содержит ряд связанных типов. В табл. 12.1 приводится список элементов этого пространства имен, о которых вам следует знать.
Таблица 12.1. Некоторые элементы пространства имен System.Reflection
Тип | Описание |
---|---|
Assembly | Этот класс (вместе с множеством связанных типов) предлагает ряд методов, позволяющих загружать, исследовать и обрабатывать компоновочный блок |
AssemblyName | Класс, позволяющий выяснить многочисленные подробности, касающиеся идентификации компоновочного блока (информацию о версии, параметры локализации и т.д.) |
EventInfo | Класс, содержащий информацию об указанном событии |
FieldInfo | Класс, содержащий информацию об указанном поле |
MemberInfо | Абстрактный базовый класс, определяющий общие характеристики поведения для типов EventInfo, Fieldlnfo, MethodInfo и PropertyInfo |
MethodInfo | Класс, содержащий информацию об указанном методе |
Module | Класс, позволяющий получить доступ к указанному модулю многомодульного компоновочного блока |
ParameterInfo | Класс, содержащий информацию об указанном параметре |
PropertyInfo | Класс, содержащий информацию об указанном свойстве |
Чтобы понять, как использовать пространство имен System.Reflection для чтения метаданных .NET программными средствами, мы с вами должны сначала ознакомиться с возможностями класса System.Type.
Класс System.Type
Класс System.Type определяет ряд членов, которые могут использоваться для чтения метаданных типа, и многие из этих членов возвращают типы из пространства имен System.Reflection. Например, тип Type.GetMethods возвращает массив типов MethodInfo, тип Type.GetFields возвращает массив типа FieldInfo и т.д. Полный набор открытых членов System.Type очень велик. В табл. 12.2 предлагается небольшой список наиболее важных из них (подробности описания можно найти в документации .NET Framework 2.0 SDK).
Таблица 12.2. Избранные члены System.Type
Тип | Описание |
---|---|
IsAbstract IsArray IsClass IsCOMObject IsEnum IsGenerlcTypeDefinition IsGenericParameter Islnterface IsPrimitive IsNestedPrivate IsNestedPublic IsSealed IsValueType | Эти свойства (наряду с другими аналогичными) позволяют выяснить ряд основных характеристик соответствующего объекта Туре (например, является ли этот объект абстрактным методом, массивом, вложенным классом и т.д.) |
GetConstructors GetEvents GetFields GetInterfaces GetMembers GetMethods GetNestedTypes GetProperties | Эти методы (наряду с другими аналогичными) позволяют получить массив, представляющий все элементы соответствующего вида (интерфейсы, методы, свойства и т.п.). Каждый метод возвращает свой массив (например, GetFields возвращает массив FieldInfо, GetMethods возвращает массив MethodInfo и т.д.). Каждый из этих методов имеет также форму единственного числа (GetMethod, GetProperty и т.д.), которая позволяет извлечь один конкретный элемент по имени, а не все связанные элементы |
FindMembers | Возвращает массив типов MemberInfo на основе заданных критериев поиска |
GetType | Статический метод, возвращающий экземпляр Туре по заданному строковому имени |
InvokeMember | Позволяет выполнить динамическую привязку к заданному элементу |
Получение Туре с помощью System.Object.GetType
Экземпляр класса Туре можно получить множеством способов. Нельзя только непосредственно создать объект Туре, используя для этого ключевое слово new, поскольку класс Туре является абстрактным. Чтобы привести пример одной из допустимых возможностей, напомним, что System.Object определяет метод GetType, который возвращает экземпляр класса Туре, представляющий метаданные соответствующего объекта.
Очевидно, что этот подход будет оправдан только в том случае, когда вы имеете информацию о соответствующем типе (в данном случае это тип SportsCar) во время компиляции. При этом становится ясно, что такие инструменты, как ildasm.exe, не могут получать информацию о типах путем непосредственно вызова System.Object.GetType, поскольку ildasm.exe не компилируется вместе с пользовательскими компоновочными блоками.
Получение Туре с помощью System.Type.GetType
Более гибкий подход обеспечивается использованием статического члена GetType класса System.Type с указанием абсолютного имени соответствующего типа в виде строки. При использовании такого подхода для извлечения метаданных уже не требуется информация о типе во время компиляции, поскольку Type.GetType использует экземпляр "вездесущего" System.String.
Метод Туре.GetType перегружен, чтобы можно было указать два параметра типа Boolean, один из которых контролирует необходимость генерирования исключения, когда тип не найден, а другой – необходимость игнорирования регистра символов в строке. В качестве примера рассмотрите следующий фрагмент программного кода.
В этом примере обратите внимание на то, что в строке, которую вы передаете в GetType, ничего не говорится о компоновочном блоке, содержащем данный тип. В этом случае предполагается, что соответствующий тип определен в рамках компоновочного блока, выполняемого в настоящий момент. Если же вы хотите получить метаданные для типа из внешнего приватного компоновочного блока, то строковый параметр должен иметь формат абсолютного имени типа, за которым через запятую должно следовать понятное имя компоновочного блока, содержащего этот тип.
Следует также знать о том, что в строке, передаваемой методу GetType, может присутствовать знак "плюс" (+), используемый для обозначения вложенного типа. Предположим, что мы хотим получить информацию для перечня (SpyOptions), вложенного в класс JamesBondCar. Для этого мы должны написать следующее.