Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 135

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 129 130 131 132 133 134 < 135 > 136 137 138 139 140 141 .. 320 >> Следующая

Type Property: System.String PetNone Ї
Type Property: Intl& CurrSpeed
Гуре Property: Intl6 MaxSpeed !.
Press any key to continue
Pl
Рис. 7.2. Класс MiniVan «под микроскопом»
324 Глава 7 • Рефлексия типов и программирование с использованием атрибутов
Вывод информации о параметрах метода
При помощи рефлексии мы можем спуститься зще на один уровень вниз и получить также информацию о параметрах конкретного метода. Например, предположим, что класс Саг определяет еще один метод: // Новый член класса Саг
public void TurnOnRadiotbool state. MusicMedia mm) {
if(state)
MessageBox,Shcw("Jamming with {0}". rni.ToStringO);
else
MessageBox.ShowC'Quiet time..."):
}
Метод ii:rriOnRocho() принимает два параметра, при этом второй параметр — это перечисление:
// Откуда будет звучать музына public enum MusicMedia
{
musicCD,
musicTape.
musicRadio
)
Для извлечения информации о параметрах метода используется метод Method-Info .GetParameters (). Этот метод возвращает массив объектов класса Parameter Info. Каждый элемент в этом массиве содержит несколько свойств, которые позволяют полностью описать любые возможные характеристики параметра. Дополним класс CarReflector новым методом GetParams(), который иллюстрирует применение всех
этих возможностей:
// Получаем информацию о параметрах для метода TurnOnRadioO private static void GetParams{Assembly a)
і
Il Получаен тип Hethodlnfo
Type miniVan - a.GetTypeC'CarLibrary.MiniVaV): Methodlnfo mi = miniVan.GetMethodCTurnOnRaJio");
И Выводим информацию о количестве параметров
Console.WriteLineC'Here are the params for (0}". mi.Name);
ParameterInfo[] myParams - mi.GetParametersO;
Console. WriteLine{"Method has " + myParams._ength + " params");
Il Выводим некоторые характеристики каждого из параметров
f oreach < Pa ramet е г I nf о pi in myParams) {
Console.WnteLineC'Param name: {0}". pi.Name):
Console.WnteLineC"Position in method: {0}", pi .Position);
Console.WnteLineC'Param type: {0}", pi .Parameter-Type):
Результат работы этой программы представлен на рис. 7.3. Код приложения CarReflector можно найти а подкаталоге Chapter 7. Как мы видим, при класса и типов, определенных в про-
странстве имен непосредственно в процессе выполнения про-
Применение позднего связывания 32,5
граммы можно получить ту же информацию, что и при помощи ILDasm.exe. Главное отличие — в наших программах мы просто выводили всю полученную информацию на системную консоль, а в ILDasm.exe та же информация представлена при помощи иерархического интерфейса.
[• V D:\CSharpBook\4_abs\Chapter 6\С er Reflet I or V НИИ
Here are the parans fov TurnOnRadio
tlethod has 2 parans
Paran narie : state
Position in nethod! B
Раг-дп type: Boolean
Рагдгт name: nil
Paait ion in method: 1
Per an type: CavLiferavy .Musicftedia
Press any hey to continue
M
Рис. 7.З. Информация о параметрах метода
Применение позднего связывания
Пространство имен System.Reflection обеспечивает еще одну важную возможность - позднее связывание. Позднее связывание (latebinding) - это технология, которая позволяет обнаруживать типы, определять их имена и члены непосредственно в процессе выполнения (в отличие от обычного раннего связывания, когда эти операции производятся во время компиляции). После того как наличие типа установлено, мы можем динамически вызывать его мзтсди, получать доступ к свойствам, устанавливать значения полей и т. п.
Как правило, позднее связывание используется в достаточно сложных nporpa.v -мах. Если у нас есть возможность обойтись ранним связыванием, то лучше так л сделать. Раннее связывание обеспечивает обнаружение возможных ошибок еще во время выполнения, и, как правило, его применение более надежно. Позднее связывание часто используется при создании средств разработки, а также для взаимодействия COM/.NET. Например, при помощи позднего связывания программист .NET может получить ссылку на интерфейс IDispatch для объекта СОМ. Подробно взаимодействие СОМ и .NET рассматривается далее в этой книге. А сейчас мы рассмотрим, как реализуется позднее связывание в С# на примере класса MiniVan.
Класс System.Activator
Главный тип, при помощи которого в .ЫЕТреализуется позднее связывание, - это класс System.Activator. В нем помимо методов, унаследованных от System.Object, содержится лишь несколько собственных членов. Самый важный из них — эта метод Acti vator. CreatelnstanceO. Этот метод предназначен для создания объекта типа во время выполнения. Существует несколько перегруженных вариантов этого да, обеспечивающих большую гибкость в использовании. Вариант CreatelnstanceO, который мы будем использовать, принимает готовый объект типа Туре:
// Создаем объект выбранного нами типа '"на лету" public class LateBind
326 Глава 7 • Рефлексия типов и программирование с использованием атрибутов
public static int Hain(stringn args)
Il Используея класс Assembly для загрузки сборки
Assembly a = null:
try
{
a = Assembly.Load("CarLibrary"):
}
catch(FileNotFoundException e) {Console.WriteLine(e.Message):}
Предыдущая << 1 .. 129 130 131 132 133 134 < 135 > 136 137 138 139 140 141 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100