Отображение параметров и возвращаемых значений методов
Отображение параметров и возвращаемых значений методов
Итак, всё работает. Теперь немного усовершенствуем наше приложение. В частности, модифицируем вспомогательную функцию ListMethods(), чтобы получать не только имя метода, но и возвращаемое значение, а также входные параметры. Для решения именно таких задач тип MethodInfo предлагает свойство ReturnType и метод GetParameters().
В следующем фрагменте программного кода обратите внимание на то, что строка, содержащая тип и имя каждого из параметров, строится с помощью вложенного цикла foreach.
public static void ListMethods(Type t) {
Console.WriteLine(***** Методы *****");
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 += ")";
// Отображение основных характеристик метода.
Console.WriteLine("-›{0} {1} (2}", retVal, m.Name, paramInfo);
}
Console.WriteLine(");
}
Если выполнить это обновленное приложение теперь, методы соответствующего типа будут описаны более подробно. Для примера на рис. 12.3 показаны метаданные методов для типа System.Globalization.GregorianCalendar.
![](https://storage.yandexcloud.net/wr4img/167642_429__12.3.png)
Рис. 12.3. Подробное описание методов System.Globalization.GregorianCalendar
Весьма увлекательно, не так ли? Ясно, что пространство имен System.Reflection и класс System.Type позволяют отображать многие другие характеристики типа, а не только те, которые в настоящий момент реализованы в MyTypeViewer. Вы вправе надеяться на то, что можно будет исследовать события типа, выяснить, какие интерфейсы реализованы явно, получить список обобщенных параметров для заданных членов и проверить множество других характеристик.
Но и в нынешнем своем виде ваш обозреватель объектов уже кое-что умеет. Главным его ограничением, конечно же, является то, что у вас нет никакой возможности отображать объекты, размещенные вне данного компоновочного блока (MyTypeViewer) или всегда доступного mscorlib.dll. В связи с этим остается открытым вопрос: "Как строить приложения, которые могут загружать (и отображать) компоновочные блоки, о которых нет информации во время компиляции?"
Исходный код. Проект MyTypeViewer размещен в подкаталоге, соответствующем главе 15.