Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Троелсен Э. Язык программирования С# 2010 и п...docx
Скачиваний:
113
Добавлен:
21.09.2019
Размер:
6.92 Mб
Скачать

Отображение методов

Мы модифицируем класс Program, чтобы определить ряд статических методов, каждый из которых будет иметь один параметр System.Type и возвращать void. Начнем с метода ListMethods(), который (как вы можете догадаться сами) печатает имена всех методов, определенных указанным на входе типом. При этом заметим, что Type.GetMethods() возвращает массив типов System.Reflection.MethodInfo.

// Отображение имен методов типа.

public static void ListMethods(Type t) {

 Console.WriteLine("***** Методы *****");

 MethodInfo[] mi = t.GetMethods();

 foreach (MethodInfo m in mi) Console.WriteLine("-›{0}", m.Name);

 Console.WriteLine(");

}

Здесь с помощью свойства MethodInfo.Name просто печатается имя метода. Как и следует предполагать, MethodInfo имеет много других членов, которые позволяют выяснить, является ли метод статическим, виртуальным или абстрактным. Кроме того, тип MethodInfo позволяет получить возвращаемое значение метода и множество его параметров. Реализацию ListMethods() мы с вами проанализируем чуть позже.

Отображение полей и свойств

Реализация ListFields() будет аналогичной. Единственным отличием будет вызов Type.GetFields(), а результирующим массивом будет FieldInfo. Для простоты мы печатаем только имена полей.

// Отображение имен полей типа.

public static void ListFields(Type t) {

 Console.WriteLine("***** Поля *****");

 FieldInfo[] fi = t.GetFields();

 foreach (FieldInfo field in fi) Console.WriteLine("-›{0}", field.Name);

 Console.WriteLine(");

}

Логика отображения свойств типа аналогична.

// Отображение имен свойств типа.

public static void ListProps(Type t) {

 Console.WriteLine("***** Свойства *****");

 PropertyInfo[] pi = t.GetProperties();

 foreach(PropertyInfo prop in pi) Console.WriteLine("-›{0}", prop.Name);

 Console.WriteLine(");

}

Отображение реализованных интерфейсов

Теперь построим метод ListInterfaces(), который будет печатать имена интерфейсов, поддерживаемых указанным на входе типом. Единственным заслуживающим внимания моментом здесь является вызов GetInterfaces(), возвращающий массив System.Types. Это логично, поскольку интерфейсы тоже являются типами.

// Отображение реализованных интерфейсов.

public static void ListInterfaces(Type t) {

 Console.WriteLine("***** Интерфейсы *****");

 Type[] ifaсes = t.GetInterfaces();

 foreach (Type i in ifaces) Console.WriteLine("-› {0}", i.Name);

}

Отображение вспомогательной информации

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

// Отображаются для полноты картины.

public static void ListVariousStats(Type t) {

 Console.WriteLine("***** Вcпомогательная информация *****");

 Console.WriteLine("Базовый класс: {0}", t.BaseType);

 Console.WriteLine("Это абстрактный тип? {0}", t.IsAbstract);

 Console.WriteLine("Это изолированный тип? {'0}", t.IsSealed);

 Console.WriteLine("Это обобщенный тип? {0}", t.IsGenericTypeDefinition);

 Console.WriteLine("Это тип класса? {0}", t.IsClass);

 Console.WriteLine(");

}