Книга: 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 - Получает пространство имен для заданного типа

Оглавление книги


Генерация: 0.914. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз