Как следует из результата выполнения приведенной выше программы, тип объекта а не совместим с типом В, и поэтому его приведение к типу В не допустимо и предот вращается в условном операторе if. Но такую проверку приходится выполнять в два этапа. Сначала требуется убедиться в обоснованности операции приведения типов, а затем выполнить ее. Оба этапа могут быть объединены в один с помощью оператора as, как демонстрирует приведенная ниже программа. // Продемонстрировать применение оператора 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 проверяют лишь совмести мость двух типов. Но зачастую требуется информация о самом типе. Для этой цели в С# предусмотрен оператор typeof. Он извлекает объект класса System.Туре для за данного типа. С помощью этого объекта можно определить характеристики конкрет ного типа данных. Ниже приведена общая форма оператора typeof: typeof(тип)
где тип обозначает получаемый тип. Информация, описывающая тип, инкапсулиру ется в возвращаемом объекте класса Туре.
Получив объект класса Туре для заданного типа, можно извлечь информацию о нем, используя различные свойства, поля и методы, определенные в классе Туре. Класс Туре довольно обширен и содержит немало членов, поэтому его рассмотрение придется отложить до следующего раздела, посвященного рефлексии. Но в качестве краткого введения в этот класс ниже приведена программа, в которой используются три его свойства: FullName, IsClass и IsAbstract. Для получения полного имени типа служит свойство FullName. Свойство IsClass возвращает логическое значение true, если тип относится к классу. А свойство IsAbstract возвращает логическое зна чение true, если класс является абстрактным. // Продемонстрировать применение оператора typeof. using System; using System.IO; 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.IO.StreamReader Относится к классу. Является конкретным классом.
В данной программе сначала извлекается объект класса Туре, описывающий тип StreamReader. Затем выводится полное имя этого типа данных и определяется его принадлежность к классу, а далее — к абстрактному или конкретному классу. Рефлексия
Рефлексия — это средство, позволяющее получать сведения о типе данных. Термин рефлексия, или отражение, происходит от принципа действия этого средства: объект класса Туре отражает базовый тип, который он представляет. Для получения инфор мации о типе данных объекту класса Туре делаются запросы, а он возвращает (отра жает) обратно информацию, связанную с определяемым типом. Рефлексия является эффективным механизмом, поскольку она позволяет выявлять и использовать возмож ности типов данных, известные только во время выполнения.
Многие классы, поддерживающие рефлексию, входят в состав прикладного интер фейса .NET Reflection API, относящегося к пространству имен System.Reflection. Поэтому для применения рефлексии в код программы обычно вводится следующая строка. using System.Reflection; Класс System.Type - ядро подсистемы рефлексии
Класс System.Туре составляет ядро подсистемы рефлексии, поскольку он ин капсулирует тип данных. Он содержит многие свойства и методы, которыми можно пользоваться для получения информации о типе данных во время выполнения. Класс Туре является производным от абстрактного класса System.Reflection. MemberInfo.
В классе MemberInfo определены приведенные ниже свойства, доступные только для чтения. Свойство Описание Type DeclaringType Тип класса или интерфейса, в котором объявляется отражаемый член MemberTypes MemberTypesТип члена. Это значение обозначает, является ли член полем, методом, свойством, событием или конструктором int MetadataToken Значение, связанное к конкретными метаданными Module Module Объект типа Module, представляющий модуль (исполняемый файл), в котором находится отражаемый тип string Name Имя типа Type ReflectedType Тип отражаемого объекта