Язык программирования C#9 и платформа .NET5
Шрифт:
На заметку! Имейте в виду, что большинство методов "получения" в
System.Туре
(GetMethods
, GetInterfaces
и т.д.) перегружены, чтобы позволить указывать значения из перечисления BindingFlags
. В итоге появляется высокий уровень контроля над тем, что в точности необходимо искать (например, только статические члены, только открытые члены, включать закрытые члены и т.д.). За более подробной информацией обращайтесь в документацию. Отображение разнообразных дополнительных деталей
В качестве последнего, но не менее важного действия, осталось реализовать финальный вспомогательный
// Просто ради полноты картины.
static void ListVariousStats(Type t)
{
Console.WriteLine("***** Various Statistics *****");
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
:
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>
, приложению потребуется передать следующую строку:
Поделиться с друзьями: