Читать книгу 📗 "Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю"
{ Console.WriteLine("***** Methods *****"); MethodInfo[] mi = t.GetMethods(); foreach(MethodInfo m in mi) { Console.WriteLine("->{0}", m.Name); } Console.WriteLine();}Здесь просто выводится имя метода с применением свойства
MethodInfo.NameMethodInfoMethodInfoListMethods()При желании для перечисления имен методов можно было бы также построить подходящий запрос LINQ. Вспомните из главы 13, что технология LINQ to Object позволяет создавать строго типизированные запросы и применять их к коллекциям объектов в памяти. В качестве эмпирического правила запомните, что при обнаружении блоков с программной логикой циклов или принятия решений можно использовать соответствующий запрос LINQ. Скажем, предыдущий метод можно было бы переписать так, задействовав LINQ:
using System.Linq;static void ListMethods(Type t){ Console.WriteLine("***** Methods *****"); var methodNames = from n in t.GetMethods() select n.Name; foreach (var name in methodNames) { Console.WriteLine("->{0}", name); } Console.WriteLine();}Рефлексия полей и свойств
Реализация метода
ListFields()ТуреGetFields()FieldInfо// Отобразить имена полей в типе.static void ListFields(Type t){ Console.WriteLine("***** Fields *****"); var fieldNames = from f in t.GetFields() select f.Name; foreach (var name in fieldNames) { Console.WriteLine("->{0}", name); } Console.WriteLine();}Логика для отображения имен свойств типа аналогична:
// Отобразить имена свойств в типе.static void ListProps(Type t){ Console.WriteLine("***** Properties *****"); var propNames = from p in t.GetProperties() select p.Name; foreach (var name in propNames) { Console.WriteLine("->{0}", name); } Console.WriteLine();}Рефлексия реализованных интерфейсов
Следующим создается метод по имени
ListInterfaces()GetInterfaces()System.Туре// Отобразить имена интерфейсов, которые реализует тип.static void ListInterfaces(Type t){ Console.WriteLine("***** Interfaces *****"); var ifaces = from i in t.GetInterfaces() select i; foreach(Type i in ifaces) { Console.WriteLine("->{0}", i.Name); }}На заметку! Имейте в виду, что большинство методов "получения" в
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); // Запечатанный?