Шрифт:
Получение Туре с помощью typeof
Наконец, можно получить информацию типа с помощью операции C# typeof.
Подобно методу Type.GetType, операция typeof оказывается полезной тем, что при ее использовании нет необходимости сначала создавать экземпляр объекта, чтобы затем извлечь из него информацию типа. Но при этом ваш базовый код все равно должен иметь информацию о типе во время компиляции.
Создание пользовательского приложения для просмотра метаданных
Чтобы очертить общие контуры процесса отображения (а также привести пример использования System.Type), мы создадим консольное приложение, которое назовем MyTypeViewer. Эта программа будет отображать подробную информацию о методах, свойствах, полях и поддерживаемых интерфейсах (и другую информацию) для любого типа из MyTypeViewer, а также из mscorlib.dll (напомним, что все приложения .NET автоматически получают доступ к этой базовой библиотеке классов).
Отображение методов
Мы модифицируем класс Program, чтобы определить ряд статических методов, каждый из которых будет иметь один параметр System.Type и возвращать void. Начнем с метода ListMethods, который (как вы можете догадаться сами) печатает имена всех методов, определенных указанным на входе типом. При этом заметим, что Type.GetMethods возвращает массив типов System.Reflection.MethodInfo.
Здесь с помощью свойства MethodInfo.Name просто печатается имя метода. Как и следует предполагать, MethodInfo имеет много других членов, которые позволяют выяснить, является ли метод статическим, виртуальным или абстрактным. Кроме того, тип MethodInfo позволяет получить возвращаемое значение метода и множество его параметров. Реализацию ListMethods мы с вами проанализируем чуть позже.
Отображение полей и свойств
Реализация ListFields будет аналогичной. Единственным отличием будет вызов Type.GetFields, а результирующим массивом будет FieldInfo. Для простоты мы печатаем только имена полей.
Логика отображения свойств типа аналогична.
Отображение реализованных интерфейсов
Теперь построим метод ListInterfaces, который будет печатать имена интерфейсов, поддерживаемых указанным на входе типом. Единственным заслуживающим внимания моментом здесь является вызов GetInterfaces, возвращающий массив System.Types. Это логично, поскольку интерфейсы тоже являются типами.
Отображение вспомогательной информации
Наконец, мы рассмотрим еще один вспомогательный метод. который будет отображать различные статистические характеристики типа (является ли тип обобщенным, какой тип для него является базовым, изолирован ли он и т.д.).