Шрифт:
Console.WriteLine("Base class is: {0}", t.BaseType); // Базовый класс
Console.WriteLine("Is type abstract? {0}", t.IsAbstract); // Абстрактный?
Console.WriteLine("Is type sealed? {0}", t.IsSealed); // Запечатанный?
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
: