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

Реализация Main()

Метод Main() класса Program запрашивает у пользователя абсолютное имя типа. После получения строковых данных они передаются методу Туре.GetType(), а извлеченный объект System.Type отправляется каждому из вспомогательных методов. Это повторяется до тех пор, пока пользователь не нажмет клавишу ‹Q›, чтобы завершить выполнение приложения.

// Здесь необходимо указать пространство имен отображения.

using System;

using System.Reflection;

...

static void Main(string[] args) {

 Console.WriteLine("***** Добро пожаловать в MyTypeViewer! *****");

 string typeName = ";

 bool userIsDone = false;

 do {

  Console.WriteLine("\nВведите имя типа");

  Console.Write("или нажмите Q для выхода из приложения: ");

  // Получение имени типа.

  typeName = Console.ReadLine();

  // Желает ли пользователь завершить работу приложения?

  if (typeName.ToUpper() = "Q") {

   userIsDone = true;

   break;

  }

  // Попытка отображения типа.

  try {

   Type t = Type.GetType(typeName);

   Console.WriteLine("");

   ListVariousStats(t);

   ListFields(t);

   ListProps(t);

   ListMethods(t);

   ListInterfaces(t);

  } catch {

   Console.WriteLine("Извините, указанный тип не найден");

  }

 } while (userIsDone);

}

К этому моменту приложение MyTypeViewer.exe уже готово для тестового запуска. Запустите это приложение и введите следующие абсолютные имена (помните о том, что при используемом здесь варианте вызова Туре.GetType() строки имен оказываются чувствительными к регистру символов).

• System.Int32

• System.Collections.ArrayList

• System.Threading.Thread

• System.Void

• System.IO.BinaryWriter

• System.Math

• System.Console

• MyTypeViewer.Program

На рис. 12.2 показана информация для случая, соответствующего выбору типа System.Math.

Риc. 12.2. Отображение System.Math

Отображение параметров и возвращаемых значений методов

Итак, всё работает. Теперь немного усовершенствуем наше приложение. В частности, модифицируем вспомогательную функцию ListMethods(), чтобы получать не только имя метода, но и возвращаемое значение, а также входные параметры. Для решения именно таких задач тип MethodInfo предлагает свойство ReturnType и метод GetParameters().

В следующем фрагменте программного кода обратите внимание на то, что строка, содержащая тип и имя каждого из параметров, строится с помощью вложенного цикла foreach.

public static void ListMethods(Type t) {

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

 MethodInfo[] mi = t.GetMethods();

 foreach (MethodInfo m in mi) {

  // Получение возвращаемого значения.

  string retVal = m.ReturnType.FullName;

  string paramInfo = "(";

  // Получение параметров.

  foreach (ParameterInfo pi in m.GetParameters()) {

   paramInfo += string.Format("{0} {1}", pi.ParameterType, pi.Name);

  }

  paramInfo += ")";

  // Отображение основных характеристик метода.

  Console.WriteLine("-›{0} {1} (2}", retVal, m.Name, paramInfo);

 }

 Console.WriteLine(");

}

Если выполнить это обновленное приложение теперь, методы соответствующего типа будут описаны более подробно. Для примера на рис. 12.3 показаны метаданные методов для типа System.Globalization.GregorianCalendar.

Рис. 12.3. Подробное описание методов System.Globalization.GregorianCalendar

Весьма увлекательно, не так ли? Ясно, что пространство имен System.Reflection и класс System.Type позволяют отображать многие другие характеристики типа, а не только те, которые в настоящий момент реализованы в MyTypeViewer. Вы вправе надеяться на то, что можно будет исследовать события типа, выяснить, какие интерфейсы реализованы явно, получить список обобщенных параметров для заданных членов и проверить множество других характеристик.

Но и в нынешнем своем виде ваш обозреватель объектов уже кое-что умеет. Главным его ограничением, конечно же, является то, что у вас нет никакой возможности отображать объекты, размещенные вне данного компоновочного блока (MyTypeViewer) или всегда доступного mscorlib.dll. В связи с этим остается открытым вопрос: "Как строить приложения, которые могут загружать (и отображать) компоновочные блоки, о которых нет информации во время компиляции?"

Исходный код. Проект MyTypeViewer размещен в подкаталоге, соответствующем главе 15.