Чтение онлайн

ЖАНРЫ

C# 4.0 полное руководство - 2011

Шилдт Герберт

Шрифт:

// Продемонстрировать применение оператора as.

using System;

class A {} class В : A {}

class CheckCast { ,

static void Main {

A a = new A;

В b = new В;

b = a as В; // выполнить приведение типов, если это возможно if(b==null)

Console.WriteLine("Приведение типов b = (В) НЕ допустимо."); else

Console.WriteLine("Приведение типов b = (В) допустимо.");

}

}

Эта программа

дает прежний результат.

Приведение типов b = (В) НЕ допустимо.

В данном варианте программы в одном и том же операторе as сначала проверяется обоснованность операции приведения типов, а затем выполняется сама операция приведения типов, если она допустима.

Применение оператора typeof

Несмотря на всю свою полезность, операторы as и is проверяют лишь совместимость двух типов. Но зачастую требуется информация о самом типе. Для этой цели в C# предусмотрен оператор typeof. Он извлекает объект класса System. Туре для заданного типа. С помощью этого объекта можно определить характеристики конкретного типа данных. Ниже приведена общая форма оператора typeof:

typeof(тип)

где тип обозначает получаемый тип. Информация, описывающая тип, инкапсулируется в возвращаемом объекте класса Туре.

Получив объект класса Туре для заданного типа, можно извлечь информацию о нем, используя различные свойства, поля и методы, определенные в классе Туре. Класс Туре довольно обширен и содержит немало членов, поэтому его рассмотрение придется отложить до следующего раздела, посвященного рефлексии. Но в качестве краткого введения в этот класс ниже приведена программа, в которой используются три его свойства: FullName, IsClass и IsAbstract. Для получения полного имени типа служит свойство FullName. Свойство IsClass возвращает логическое значение true, если тип относится к классу. А свойство IsAbstract возвращает логическое значение true, если класс является абстрактным.

// Продемонстрировать применение оператора typeof.

using System; using System.10;

class UseTypeof {

static void Main {

Type t = typeof(StreamReader);

Console.WriteLine(t.FullName);

if (t.IsClass) Console.WriteLine("Относится к классу."); if (t.IsAbstract) Console.WriteLine("Является абстрактным классом."); else Console.WriteLine("Является конкретным классом.");

}

}

Эта программа дает следующий результат.

System.10.StreamReader Относится к классу.

Является конкретным классом.

В данной программе сначала извлекается объект класса Туре, описывающий тип StreamReader. Затем

выводится полное имя этого типа данных и определяется его принадлежность к классу, а далее — к абстрактному или конкретному классу.

Рефлексия

Рефлексия — это средство, позволяющее получать сведения о типе данных. Термин рефлексия, или отражение, происходит от принципа действия этого средства: объект класса Туре отражает базовый тип, который он представляет. Для получения информации о типе данных объекту класса Туре делаются запросы, а он возвращает (отражает) обратно информацию, связанную с определяемым типом. Рефлексия является эффективным механизмом, поскольку она позволяет выявлять и использовать возможности типов данных, известные только во время выполнения.

Многие классы, поддерживающие рефлексию, входят в состав прикладного интерфейса .NET Reflection API, относящегося к пространству имен System. Reflection. Поэтому для применения рефлексии в код программы обычно вводится следующая строка.

using System.Reflection;

Класс System. Type - ядро подсистемы рефлексии

Класс System. Туре составляет ядро подсистемы рефлексии, поскольку он инкапсулирует тип данных. Он содержит многие свойства и методы, которыми можно

пользоваться для получения информации о типе данных во время выполнения. Класс Туре является производным от абстрактного класса System. Re flection. Member Inf о.

В классе Member Inf о определены приведенные ниже свойства, доступные только для чтения.

Свойство

Описание

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

Поделиться с друзьями: