Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы Java и C# технологии.doc
Скачиваний:
171
Добавлен:
01.03.2016
Размер:
3.04 Mб
Скачать
      1. Получение информации о типе

Рефлексия– это получение информации о типах во время выполнения программы. Например, можно получить список всех классов и интерфейсов сборки, список элементов каждого из классов, список параметров каждого метода и т.д. вся информация берется из метаданных сборки.

Исходя из концепции унификации системы типов в C# каждый тип (в том числе и простой) в среде .NET связан со специальным объектом-типом. Класс Type пространства имен System играет ключевую роль в системе работы с метаданными. Любая деятельность по извлечению и использованию информации о типе связана с применением этого класса.

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

Поэтому работа с типом начинается с получения соответствующего экземпляра класса Type.

        1. Экземпляр типа Type

Экземпляр типа Type может быть представлен любым из следующих типов:

  • классы;

  • размерные типы (Value types);

  • массивы;

  • интерфейсы;

  • указатели;

  • индексаторы (нумераторы).

Ссылка на объект Type, ассоциируемый с типом, может быть получена одним из следующих способов:

  • метод Object.GetTypeвозвращает объектType, представляющий тип заданного экземпляра объекта;

  • статический метод GetTypeвозвращает объектType, который представляет тип, указанный посредством своего полного имени;

  • методы Module.GetTypes,Module.GetType, иModule.FindTypesвозвращают объектType, который представляет типы, определенные в модуле. МетодGetTypesпозволяет получить массив объектов для всех общедоступных и защищенных типов, определенных в модуле;

  • метод FindInterfacesвозвращает отфильтрованный список интерфейсов типов, которые поддерживаются данным типом;

  • метод GetElementTypeвозвращает объектType, который представляет элемент;

  • методы GetInterfacesиGetInterfaceвозвращают объектType, который представляет интерфейс, поддерживаемый типом;

  • метод GetTypeArrayвозвращает массив объектовType, которые представляют типы, заданные посредством набора объектов;

  • методы GetTypeFromProgID иGetTypeFromCLSIDвозвращают объектType, который указывается черезProgIDилиCLSID(методы предоставляются для совместимости с СОМ);

  • метод GetTypeFromHandleвозвращает объектType, который указывается посредством дескриптора (метод предоставляется для совместимости);

  • оператор typeofполучает объектTypeдля указанного типа.

Метаданные- это информация о выполнимом модуле, получаемая во время выполнения приложения. К такой информации относятся и данные о типе. В случае неправильного указания имени типа возникает исключение. Поэтому указание типа следует заключать в блокtry-catch.

Например:

try

{

Type tp = Type.GetType(s); //тип объекта s

Console.WriteLine("Имя типа : {0}",tp.FullName);

}

catch (System.NullReferenceException)

{

Console.WriteLine("Ошибка задания типа");

}

Класс Typeпредоставляет большой набор свойств для запроса информации по типу, включая следующие:

  • FullName - возвращает имя типа;

  • IsClass- определяет, является ли тип классом;

  • IsAbstract- определяет, является ли тип абстрактным классом;

  • IsNestedPublic- определяет, является ли тип вложенным и общедоступным;

  • IsPublic- определяет, является ли данный тип общедоступным;

  • IsNotPublic- определяет, является ли данный тип защищенным;

  • IsSealed- определяет, является ли тип конечным (не может быть базовым классом);

  • IsArray- определяет, представляет ли указанный тип массив;

  • GUID- возвращает значение типаGUID, ассоциированное с данным типом (такое значение хранится в реестреWindows).

  • IsNestedAssembly- определяет, является ли тип вложенным и видимым только в своей собственной сборке;

  • Module- возвращает модуль (DLL) в котором объявлен данный тип;

  • Namespace- возвращает пространство имен, содержащее данный тип;

  • Свойство IsByRefпозволяет определить, передается ли указанный элемент по типу, а свойство Assembly определяет сборку.