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

 

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

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

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

Il Получаем объект Type для класса MiniVan Type miniVan - a.GetTypeC'CarLibrary MiniVan");
II Создаем объект класса MiniVan "на лету" object obj - Activator.Createlnstance(miniVan);
}
:i
В настоящий момент переменная obj указывает наобъект класса MiniVan, который был создан при помощи метода Activator. (>( ¦atelnstance. Теперь предположим, что нам надо вызвать метод TurbuBcosti) для зтзго объекта. Как мы поліпим, для автомобиля этого типа такое ускорение приводит к безвременной кончине двигателя (состояние egnState принимает значение dead) и выводу окна сообщения.
Поскольку мы используем позднее с низы на п не, вызов метода для объекта — не такое простое дело. Вначале мы должны полу1 ить объект класса Method Inf с для метода TurboBoostO при помощи Type.GetMethodf ). Затем мы можем использовать .этот объект Methodinfo, чтобы при помощи метода InvokeC) вызвать метод TurboBoostO. Metholnfo. InvokeC) требует, чтобы все параметры, которые нужно будет передать вызываемому методу, передавались IiT'ok?() как массив объектов класса System.Object. Поскольку нашему TurboBoostO никакие параметры не нужны, мы можем просто передать значение типа n j I 1 (оно как раз и значит, что вызываемому методу параметры не передаются);
public static int Main(string[] args) {
// Загружаем CarLibrary при помощи класса Assembly
II Получаем объект типа Туре
Type miniVan - a.GetTypeC'CarLibrary.MiniVan");
Il Создаем объект класса MiniVan "на лету" object obj - Activator.Createlnstance(miniV.in):
Il Получаем объект класса Methodinfo для негода TurboBoostO Methodlnfo mi - miniVan.GetMethod("TurboBoo;t"):
Il Вызываем метод (передаем null вместо параметров) mi. invoke (obj, null); return 0;
}
Если все сделано правильно, мы увидим окго сообщения, подобное представленному на рис. 7.4.
Применение динамических сборок 327
Vour car is de«*j ЕЭ
Tlroa to «I AAA
tig
Рис. 7.4. Позднее связывание
А теперь предположим, что нам нужно при помощи позднего связывания вызвать следующий новый метод класса MiniVan;
// Прсеоїй* чйротворческув cneosuns..
public void TellChildToBeQuiet<string kidMame. int shamelntensity)
{
for(int і - 0; і < numb; 1++)
MessageBox.ShowC'Be qiieit {0}!!. kidName);
Метод Tel і Chi ШоЗэС.иеЦ) принимает два параметра. В этом случае для вьізої і этого при помощи Methodlnfo. InvokeO нам придется создать массив параметров:
// Так вызывается при покоши общего с»языеанмя не-од с параметрами
object[] paramArray - new object[23:
рагатАггауГО] = "Fred": // Имя ребенка
paramArray[l] = 4; // Насколько сильно его надо устыдить
mi = miniVan.GetMethodCTellChildToBeQueit"):
mi.Invokefobj. paramArray);
При запуске этой программы сразу четыре окна сообщения будут призывать Фредерика к порядку (рис. 7.5).
Be quiet FtedS!
OK
3
Рис. 7.5. Вызов метода с параметрами при позднем связывании Код приложения Laie?izidirig можно найти в подкаталоге Chapter 7.
Применение динамических сборок
Следующий пункт в нашей программе — это различия между статическими и динамическими сборками. Статические сборки — это те сборки, с которыми мы работали все это время (и будем работать дальше): они существуют в виде файлов на жестком диске или других носителях. В отличие от них динамические сборки создаются в оперативной памяти «налету», прямо в процессе выполнения программы. Д.т і этого используются типы, определенные в пространстве имен Sy stern. Ref 1 ect ion. Emi t. •" После того как мы создали сборку вместе с модулями и находящимися в ней типа ми, мы можем сохранить ее (опять-таки в процессе выполнения программы) на жестком диске. В результате будет создана новая статическая сборка! Кроме того,
328 Глава 7 • Рефлексия типов и программирование с использованием атрибутов
при помощи типов из возможно добавлять новые
типы и члены в представление уже загруженной в оперативную память сборки.
Знакомство с пространством имен System.Reflection.Emit
Более всего типы из пространства имен System Reflect і on. Emit полезны для программистов, занимающихся созданием различных средств разработки. Например, представим себе, что перед нами поставлена необычная задача: разработать версию QuickBasic для работы в среде .NET (интересно, использует ли еще QuickBasic кто-нибудь из читающих эту книгу?).
При помощи System.Reflection,Emit мы можем создать средство, преобразующее код QuickBasic в динамически создаваемую сборку. Несмотря нато что такая задача выглядит несколько странной, именно так работают .NET-совместимыеязы-ки, предназначенные для использования в Web, например JScript.NET. Самые важные типы из пространства имен System. Reflection. Frr.i t представлены в табл. 7.3.
Таблица 7.3. Некоторые типы пространства имен System.Reflection.Emit
Тип
Назначение
AssemblyBuilder
ModuleBuilder
EnumBuilder TypeBuifder
MethodBuilder
EventBuiider
LocalBullder
PropertyBuilder
FieldBuilder
ConstructorBuilder
CustomAttri buteBui lder
ILGenerator
Используется для создания сборки в процессе работы программы. Этот тип может быть использован для создания как сборок типа ЕХЕ, так и DLL Если в создаваемой сборке определен вызов метода ModuleBuilder.SetEntryPolntO, TCI будет сгенерирована сборка в формате ,ЕХЕ, если нет - то в формате I3LL
Предыдущая << 1 .. 130 131 132 133 134 135 < 136 > 137 138 139 140 141 142 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100