Литмир - Электронная Библиотека
A
A

  Console.WriteLine("Is type generic? {0}", t.IsGenericTypeDefinition); // Обобщенный?

  Console.WriteLine("Is type a class type? {0}", t.IsClass); // Тип класса?

  Console.WriteLine();

}

Добавление операторов верхнего уровня

Операторы верхнего уровня в файле

Program.cs
запрашивают у пользователя полностью заданное имя типа. После получения этих строковых данных они передаются методу
Туре.GetType()
, а результирующий объект
System.Туре
отправляется каждому вспомогательному методу. Процесс повторяется до тех пор, пока пользователь не введет Q для прекращения работы приложения.

Console.WriteLine("***** Welcome to MyTypeViewer *****");

string typeName = "";

do

{

  Console.WriteLine("\nEnter a type name to evaluate");

                    // Пригласить ввести имя типа.

  Console.Write("or enter Q to quit: "); // или Q для завершения

  // Получить имя типа

  typeName = Console.ReadLine();

  // Пользователь желает завершить программу?

  if (typeName.Equals("Q",StringComparison.OrdinalIgnoreCase))

  {

    break;

  }

  // Попробовать отобразить информацию о типе.

  try

  {

    Type t = Type.GetType(typeName);

    Console.WriteLine("");

    ListVariousStats(t);

    ListFields(t);

    ListProps(t);

    ListMethods(t);

    ListInterfaces(t);

  }

  catch

  {

    Console.WriteLine("Sorry, can't find type");

  }

} while (true);

В настоящий момент приложение

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

System.Int32

System.Collections.ArrayList

System.Threading.Thread

System.Void

System.10.BinaryWriter

System.Math

MyTypeViewer.Program

Ниже показан частичный вывод при указании

System.Math
:

***** Welcome to MyTypeViewer *****

Enter a type name to evaluate

or enter Q to quit: System.Math

***** Various Statistics *****

Base class is: System.Object

Is type abstract? True

Is type sealed? True

Is type generic? False

Is type a class type? True

***** Fields *****

->PI

->E

***** Properties *****

***** Methods *****

->Acos

->Asin

->Atan

->Atan2

->Ceiling

->Cos

...

Рефлексия статических типов

Если вы введете

System.Console
для предыдущего метода, тогда в первом вспомогательном методе сгенерируется исключение, потому что значением
t
будет
null
. Статические типы не могут загружаться с помощью метода
Туре.GetType(typeName)
. Взамен придется использовать другой механизм — функцию
typeof
из
System.Туре
. Модифицируйте программу для обработки особого случая
System.Console
:

Type t = Type.GetType(typeName);

if (t == null && typeName.Equals("System.Console",

    StringComparison.OrdinalIgnoreCase))

{

  t = typeof(System.Console);

}

Рефлексия обобщенных типов

При вызове

Type.GetType()
для получения описаний метаданных обобщенных типов должен использоваться специальный синтаксис, включающий символ обратной одинарной кавычки (
'
), за которым следует числовое значение, представляющее количество поддерживаемых параметров типа. Например, чтобы вывести описание метаданных
System.Collections.Generic.List<T>
, приложению потребуется передать следующую строку:

System.Collections.Generic.List`1

322
{"b":"847442","o":1}