Язык программирования C#9 и платформа .NET5
Часть 322 из 642 Информация о книге
Console.WriteLine("Is type generic? {0}", t.IsGenericTypeDefinition); // Обобщенный?Console.WriteLine("Is type a class type? {0}", t.IsClass); // Тип класса?Console.WriteLine();}Добавление операторов верхнего уровня
Операторы верхнего уровня в файле
запрашивают у пользователя полностью заданное имя типа. После получения этих строковых данных они передаются методуProgram.cs, а результирующий объектТуре.GetType()отправляется каждому вспомогательному методу. Процесс повторяется до тех пор, пока пользователь не введет Q для прекращения работы приложения.System.Туре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 evaluateor enter Q to quit: System.Math***** Various Statistics *****Base class is: System.ObjectIs type abstract? TrueIs type sealed? TrueIs type generic? FalseIs 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.ConsoleType 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