Книга: C# 4.0: полное руководство
Рефлексия
Рефлексия
Рефлексия — это средство, позволяющее получать сведения о типе данных. Термин рефлексия, или отражение, происходит от принципа действия этого средства: объект класса Туре
отражает базовый тип, который он представляет. Для получения информации о типе данных объекту класса Туре
делаются запросы, а он возвращает (отражает) обратно информацию, связанную с определяемым типом. Рефлексия является эффективным механизмом, поскольку она позволяет выявлять и использовать возможности типов данных, известные только во время выполнения.
Многие классы, поддерживающие рефлексию, входят в состав прикладного интерфейса .NET Reflection API, относящегося к пространству имен System.Reflection
. Поэтому для применения рефлексии в код программы обычно вводится следующая строка.
using System.Reflection;
Класс System.Type - ядро подсистемы рефлексии
Класс System.Туре
составляет ядро подсистемы рефлексии, поскольку он инкапсулирует тип данных. Он содержит многие свойства и методы, которыми можно пользоваться для получения информации о типе данных во время выполнения. Класс Туре
является производным от абстрактного класса System.Reflection.MemberInfо
.
В классе MemberInfо
определены приведенные ниже свойства, доступные только для чтения.
Свойство - Описание
Type DeclaringType - Тип класса или интерфейса, в котором объявляется отражаемый член
MemberTypes MemberType - Тип члена. Это значение обозначает, является ли член полем, методом, свойством, событием или конструктором
int MetadataToken - Значение, связанное к конкретными метаданными
Module Module - Объект типа Module, представляющий модуль (исполняемый файл), в котором находится отражаемый тип
string Name - Имя типа
Type ReflectedType - Тип отражаемого объекта
Следует иметь в виду, что свойство MemberType
возвращает тип MemberTypes
— перечисление, в котором определяются значения, обозначающие различные типы членов. К их числу относятся следующие.
MemberTypes.Constructor
MemberTypes.Method
MemberTypes.Field
MemberTypes.Event
MemberTypes.Property
Следовательно, тип члена можно определить, проверив свойство MemberType
. Так, если свойство MemberType
имеет значение MemberTypes.Method
, то проверяемый член является методом.
В класс Memberlnfо
входят два абстрактных метода: GetCustomAttributes()
и IsDefined()
. Оба метода связаны с атрибутами. Первый из них получает список специальных атрибутов, имеющих отношение к вызывающему объекту, а второй устанавливает, определен ли атрибут для вызывающего метода. В версию .NET Framework Version 4.0 внедрен метод GetCustomAttributesData()
, возвращающий сведения о специальных атрибутах. (Подробнее об атрибутах речь пойдет далее в этой главе.)
Класс Туре
добавляет немало своих собственных методов и свойств к числу тех, что определены в классе Memberlnfо
. В качестве примера ниже перечислен ряд наиболее часто используемых методов класса Туре
.
Метод - Назначение
Constructorlnfо[] GetConstructors() - Получает список конструкторов для заданного типа
EventInfo[] GetEvents() - Получает список событий для заданного типа
Fieldlnfо[] GetFields() - Получает список полей для заданного типа
Type[] GetGenericArguments() - Получает список аргументов типа, связанных с закрыто сконструированным обобщенным типом, или же список параметров типа, если заданный тип определен как обобщенный. Для открыто сконструированного типа этот список может содержать как аргументы, так и параметры типа. (Более подробно обобщения рассматриваются в главе 18.)
MemberInfo[] GetMembers() - Получает список членов для заданного типа
MethodInfo[] GetMethods() - Получает список методов для заданного типа
PropertyInfo[] GetProperties() - Получает список свойств для заданного типа
Далее приведен ряд наиболее часто используемых свойств, доступных только для чтения и определенных в классе Туре
.
Свойство - Назначение
Assembly Assembly - Получает сборку для заданного типа
TypeAttributes Attributes - Получает атрибуты для заданного типа
Type BaseType - Получает непосредственный базовый тип для заданного типа
string FullName - Получает полное имя заданного типа
bool IsAbstract - Истинно, если заданный тип является абстрактным
bool isArray - Истинно, если заданный тип является массивом
bool IsClass - Истинно, если заданный тип является классом
bool IsEnum - Истинно, если заданный тип является перечислением
bool IsGenericParameter - Истинно, если заданный тип является параметром обобщенного типа. (Более подробно обобщения рассматриваются в главе 18.)
bool IsGenericType - Истинно, если заданный тип является обобщенным. (Более подробно обобщения рассматриваются в главе 18.)
string Namespace - Получает пространство имен для заданного типа