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