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

 

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

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

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

Первое, что нам потребуется сделать для получения информации о сборке, - загрузить эту сборку в память. Давайте создадим новый консольный проект С# с именем CarRefLection, который будет производить загрузку сборки CarLibrary (она была создана нами в предыдущей главе). Для загрузки сборки используется статический метод которому передается дружественное текстовое имя
// Получаем о сборке CarLibrary
namespace CarReflector
using System;
using System. Ref lection:
using System. 10; Il Нужно для использования FileNotFoundException
public class CarReflector
г
public static int riair.vst-ir'gr.j' args)
II Используем метод Assembly.Load() для загрузки сборки
Assembly a = null:
try
{
a-Assembly.Load("CarLibrary");
>
catch(FileNotFoundException e) {Consol e. Wr і teU ne(e. Message):}
return 0:
}
) }
322 Глава 7 • Рефлексия типов и программирование с использованием атрибутов
Обратите внимание, что в нашем примере мы передаем методу Assembly. Load') только дружественное текстовое имя сборки, которую нужно загрузить в память. Однако, как вы, наверное, уже догадываетесь, существует множество перегруженных вариантов этого метода, которые принимают и другую информацию, которая может оказаться необходимой. Методу Assembly. Lead О можно передать в качестве параметра кроме текстового имени еще и номер версии, значение открытого ключа, информацию о естественном языке, использованном в сборке, и «сильное имя»
сборки.
Весь вышеперечисленный набор элементов, характеризующих сборку, носит общее название «отображаемого имени» (display name). Формат этого имени выглядит как текстовое имя, за которым через следуют необязательные остальные элементы (они могут быть приведены в любом порядке). Шаблон отображаемого имени выглядит следующим образом:
Имя CLcc - Информация о_ест$сгЁенном_я!ыке) (,Ver = Основная.Доіюткг&іьная Редакция. Сборка) (,SN - Снльное~ийя)
SN = nul 1 означает, что загружаемая сборка — частная (а не для общего доступа). I. ос='"" (пустое значение для естественного языка) значит, что используется естественный язык по умолчанию. Например:
// Загрузка сборки с использованием отображаемого имени
a = Assembly.Load С 0"CarL1Ьгагу. Ver-1.0.454.30104. SN-null, Loc="""):
Кроме того, в System. Reflect і on предусмотрен специальный класс AssemblyName, который можно передавать Assembly .Load () в качестве параметра (вместо отображаемого имени). Выглядеть это может так:
// Такое "обгектно-ориентировакное" иня сборки
AssemblyName asmName; asmName = new AssemblyName О; asm.Name - "CarLibrary";
Version V - new VerSiOnC'l.0.454.30104"); asmName. Version = v;
a = Assembly. L cad (a STiMa me):
Вывод информации о типах в сборке
Теперь, когда мы загрузили сборку CarLibrary, можно получить информацию об имени каждого типа, определенного в этой сбор <е. Для этого используется метод Assembly.GetTypesC):
public class CarReflector
{
public static im Main(string[] args) {
Assembly a = null: try
{
a=Assembly.Load("CarLibrary");
}
catchCFiletdotFoundException e)
Загрузка сборки 323
{Console.WriteLinefe.Message):}
Li stA! ITypes(a) -. return 0;
}
II Выводом информации о всех типах в сборке private static void L і stП Types t Assembl v a)
І
Console.WriteLinef"Listing all types in (0}". a.FullName); Type[] types = a.GetTypesO; foreachdype t in types)
Console. Wr UeLi net "Type: {O}", t);
}
)
Вывод информации о членах класса
Предположим, что нам потребовалось получить при выполнении программы информацию о всех членах одного из классов CarLibrary (пусть это будет класс Hi ni Van). Сделать это очень просто — достаточно воспользоваться методом GetMembers(), on ределенным в классе System. Type, как показано ниже. В этом классе предусмотрены также методы GetPropertiesC}, GetMetlodsС 5 и прочие, которые можно иснользоват для получения списка не всех членов класса, а только определенной их разновидности. Метод GetMembersO возвращает массив типов Member Info. Пример применения Type. GetMembers О может выглядеть так:
// Еще один статический иетод класса CarReflector private static void Li stAll Members (Assembly a) {
Type mini Van = a,GetTypet"CarLibrary.Mini Van"): Meraberlnfot] mi - піп і Van. GetMembersO: foreachtMemberlnfo m in mi)
Console.WriteLineC'Type {0}: {1} ", m.MemberType JoStringO . m):
;
Результат работы программы представлен на рис. 7.2.
I" D:\CSharpBook\labs\Chapter 6 ,CarReHector\bin>Dgh<jg\CarRenertoi-.eMe ЯВО
Listing all nernbers for CorLibrary. Піп iUan і
Гуре Methods Uoid TurboBoOst <>
Type tletbou: Int32 GetHasW-ode <>
Type Method: Boolean Equals CSysten.Object)
Type Method: System.String ToString O
Гуре Method: System.String get_PetN<ime O
Type Method: tloid oet_PetNarae CSystem.String)
lype Method: hit. IG <jet_CufiLSpeed O
,Type Method: Uoid set_CurrSpeed <lntl6> J
;Гуре Method: Intlb getJIaxSpeed <) 1
Jype Method: Uoid TurnOnRadiq <Bnolean, CarLibrary.MusicMedia) Type Method: System.Type GetType O Ij
type Constructor: Uoid .ctor O
Type Constructor: Uoid .ctor <Systen.String. Intl6. Intl6)
Предыдущая << 1 .. 128 129 130 131 132 133 < 134 > 135 136 137 138 139 140 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100