Получение информации о типе
Рефлексия – это получение информации о типах во время выполнения программы. Например, можно получить список всех классов и интерфейсов сборки, список элементов каждого из классов, список параметров каждого метода и т.д. вся информация берется из метаданных сборки.
Исходя из концепции унификации системы типов в C# каждый тип(в том числе и простой) в среде .NET связан со специальным объектом-типом. Класс Type пространства имен System играет ключевую роль в системе работы с метаданными. Любая деятельность по извлечению и использованию информации о типе связана с применением этого класса.
Экземпляр класса Type позволяет получить полную информацию о типе: информацию о его методах, свойствах, вложенных типах, информацию о сборке и модуле, содержащих данный тип, полное имя типа и многое другое. Более того, с помощью класса Type можно динамически создавать экземпляры описываемого им типа (класса), а также исполнять методы и работать со свойствами полученного объекта.
Поэтому работа с типом начинается с получения соответствующего экземпляра класса Type.
Экземпляр типа 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 определяет сборку.