Страница 253 из 502
<b>// Продемонстрировать применение оператора typeof.</b>
<b>using System;</b>
<b>using System.IO;</b>
<b>class UseTypeof {</b>
<b> static void Main() {</b>
<b> Type t = typeof(StreamReader);</b>
<b> Console.WriteLine(t.FullName);</b>
<b> if (t.IsClass)</b>
<b> Console.WriteLine("Относится к классу.");</b>
<b> if (t.IsAbstract)</b>
<b> Console.WriteLine("Является абстрактным классом.");</b>
<b> else </b>
<b> Console.WriteLine("Является конкретным классом.");</b>
<b> }</b>
<b>}</b>
Эта программа дает следующий результат.
<b>System.10.StreamReader</b>
<b>Относится к классу.</b>
<b>Является конкретным классом.</b>
В данной программе сначала извлекается объект класса Туре, описывающий тип StreamReader. Затем выводится полное имя этого типа данных и определяется его принадлежность к классу, а далее — к абстрактному или конкретному классу.
Рефлексия
Рефлексия — это средство, позволяющее получать сведения о типе данных. Термин рефлексия, или отражение, происходит от принципа действия этого средства: объект класса Туре отражает базовый тип, который он представляет. Для получения информации о типе данных объекту класса Туре делаются запросы, а он возвращает (отражает) обратно информацию, связанную с определяемым типом. Рефлексия является эффективным механизмом, поскольку она позволяет выявлять и использовать возможности типов данных, известные только во время выполнения.
Многие классы, поддерживающие рефлексию, входят в состав прикладного интерфейса .NET Reflection API, относящегося к пространству имен System.Reflection. Поэтому для применения рефлексии в код программы обычно вводится следующая строка.
<b>using System.Reflection;</b>
Класс System.Туре составляет ядро подсистемы рефлексии, поскольку он инкапсулирует тип данных. Он содержит многие свойства и методы, которыми можно пользоваться для получения информации о типе данных во время выполнения. Класс Туре является производным от абстрактного класса System.Reflection.MemberInfо.
В классе MemberInfо определены приведенные ниже свойства, доступные только для чтения.
Свойство - Описание
Type DeclaringType - Тип класса или интерфейса, в котором объявляется отражаемый член
MemberTypes MemberType - Тип члена. Это значение обозначает, является ли член полем, методом, свойством, событием или конструктором
int MetadataToken - Значение, связанное к конкретными метаданными
Module Module - Объект типа Module, представляющий модуль (исполняемый файл), в котором находится отражаемый тип
string Name - Имя типа
Type ReflectedType - Тип отражаемого объекта
Следует иметь в виду, что свойство MemberType возвращает тип MemberTypes — перечисление, в котором определяются значения, обозначающие различные типы членов. К их числу относятся следующие.
<b>MemberTypes.Constructor</b>
<b>MemberTypes.Method</b>
<b>MemberTypes.Field</b>
<b>MemberTypes.Event</b>
<b>MemberTypes.Property</b>
Следовательно, тип члена можно определить, проверив свойство 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() - Получает список свойств для заданного типа
Далее приведен ряд наиболее часто используемых свойств, доступных только для чтения и определенных в классе Туре.
Свойство - Назначение