Чтение онлайн

ЖАНРЫ

Язык программирования C#9 и платформа .NET5
Шрифт:
empty-line/>

На заметку! Имейте в виду, что большинство методов "получения" в

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>
, приложению потребуется передать следующую строку:

Поделиться с друзьями: