Здесь указано числовое значение 1
List имеет только один параметр типа. Однако для применения рефлексии к типу Dictionary понадобится предоставить значение 2:System.Collections.Generic.Dictionary`2
Рефлексия параметров и возвращаемых значений методов
Пока все хорошо! Далее мы внесем небольшое усовершенствование в текущее приложение. В частности, вы обновите вспомогательную функцию ListMethods()
MethodInfo предоставляет свойство ReturnType и метод GetParameters() для выполнения этих задач. В следующем измененном коде обратите внимание, что вы создаете строку, которая содержит тип и имя каждого параметра с помощью вложенного цикла foreach (без использования LINQ):static void ListMethods(Type t)
{
Console.WriteLine("***** Methods *****");
MethodInfo[] mi = t.GetMethods();
foreach (MethodInfo m in mi)
{
// Получить возвращаемый тип.
string retVal = m.ReturnType.FullName;
string paramInfo = "( ";
// Получить параметры.
foreach (ParameterInfo pi in m.GetParameters())
{
paramInfo += string.Format("{0} {1} ", pi.ParameterType, pi.Name);
}
paramInfo += " )";
Теперь выведите на экран базовый метод sig.
Console.WriteLine("->{0} {1} {2}", retVal, m.Name, paramInfo);
}
Console.WriteLine();
}
Если вы запустите это обновленное приложение, вы обнаружите, что методы данного типа стали гораздо более подробными. Если вы введете в программу в качестве входных данных вашего доброго друга System.Object
***** Methods *****
->System.Type GetType ( )
->System.String ToString ( )
->System.Boolean Equals ( System.Object obj )
->System.Boolean Equals ( System.Object objA System.Object objB )
->System.Boolean ReferenceEquals ( System.Object objA System.Object objB )
->System.Int32 GetHashCode ( )
Текущая реализация ListMethods()
System.Reflection. В качестве крайнего сокращения, имейте в виду, что все типы XXXInfo (MethodInfo, PropertyInfo, EventInfo и т.д.) переопределили функцию ToString() для отображения сигнатуры запрашиваемого элемента. Таким образом, вы также можете реализовать ListMethods() следующим образом (снова используя LINQ, где вы просто выбираете все объекты MethodInfo, а не только значения Name значения):static void ListMethods(Type t)
{
Console.WriteLine("***** Methods *****");
var methodNames = from n in t.GetMethods() select n;
foreach (var name in methodNames)
{
Console.WriteLine("->{0}", name);
}
Console.WriteLine();
}
Интересный материал, да? Очевидно, что пространство имен System.Reflection
System.Type позволяют вам отражать многие другие аспекты типа, помимо того, что MyTypeViewer отображает в данный момент. Как вы и ожидали можно получить события типа, список всех общих параметров для данного члена и другие подробности. десятки других деталей. Тем не менее, на данном этапе вы создали (в некоторой степени способный) браузер объектов. Основное ограничение в этом конкретном примере заключается в том, что у вас нет возможности отразить не только текущую сборку (MyTypeViewer
mscorlib.dll. В связи с этим возникает вопрос: "Как я могу создавать приложения, которые могут загружать (и отражать поверх) сборки, на которые нет ссылок во время компиляции? во время компиляции?" Рад, что вы спросили.Динамическая загрузка сборок