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

 

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

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

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

// Получаем ифрнацт об ияенал всех кетацае Foo public static void ListMethods(Foo f)
{
Con sol e. Wr і teLine (''***** Methods of Foo *****">;
Type t = f.GetTypet): Hethodlnfo[] mi = t.GetMethodsO: foreacMMethodlnfo m in mi)
Console.WriteLine("Method:(0)". m.Name);
Corisole WriteLine() ¦
}
Метод Li stFi el ds () очень похож на Li stMethods. Отличие заключается в том, что мы получаем список нолей, а не методов и работаем с массивом типов fllecJInfo вместо Methodlnfo:
// Получаем информацию об именах всех полей Foo
public static void Li stFi el ds CFoo f)
{
Console.WriteUneC'***** Fields of Foo *****");
Type t = f.GetTypeO; F1eldInfo[] fi = t.GetFieldsO; foreach (Fi eld Info field in fi)
Console.WriteLineC'Field: (D)". field.Name):
Console WriteLinet"**************************\n")¦
}
Методы ListVariosStatsO, ListPrqpsO и Li stlnterfaces(), видимо, объяснять уже
не надо:
Il Выводим разную информацию о Foo public static void ListVanosStats(Foo f) {
Console.Wn'teLinet****** Various stats about Foo *****")¦ Type t = f.GetTypeO:
Console.Wr1teLine('Ful I name is: {0}'. t .FiillName):
Класс Type 31 ї
Console.WriteLi neC'Base is: {0}". t.BaseTypek Console.WriteLineC'Is it abstract? {O]". t.lsAbstract): Console.WriteLineC'ls it a COM object? {0}". t.IsCOMObject): Console.WriteLineC'Is it sealed? {0}", t.IsSealed): Console.WriteLineC'ls it a class? {O)". t.lsClass);
Console Writetinet"**************************\n")¦
I
Il Выводим список всех свойств public static void ListPorps(FoO f) {
Console.WriteLinetProperties of Foo *****");
Type t - f.GetTypet);
Propertylnfo[] pi - t.GetPropertlesO:
foreachfPropertylnfo prop in pi}
Console.WriteLineCProp: {0}". prop.Name):
Consol є Wr і teL і ne(" **************************\r," ) ¦
}
Il Выводии список всех интерфейсов, поддерживаемых Foo
public static void Listinterfaces (Foo f) {
Cons о 1 e. Wri tet ine Г***** Interfaces of Foo *****".);
Type t - f.GetTypeO;
Type[] ifaces = t.GetlrtterfacesO;
foreachfType і in ifaces)
Console.WriteL1ne("Interface: {0}". i.Name);
Console WriteLine() ¦
}
Метод Main() в классе FooRe a de г должен просто вызвать каждый из этих статических методов:
// Кладем Foo под "увеличительное стекло"
namespace TheType
[
using System;
Il Требуется для использования Methodinfo, Fieldlnfo и т.д. using System. Reflection:
puhlu: class FooReader {
Il Здесь - определения статических нетодов, приведенные выше
public static int Main(string[] args) {
// Создаем новый объект класса Foo Foo theFoo = new Foo():
Il А теперь получаем всю информацию о классе Foo ListVariouStats(theFoo):
320 Глава 7 • Рефлексия типов и программирование с использованием атрибутов
ListMethods(theFoo).: ListFields(theFoo); ListProps(thefoo): Listlnterfaces(theFoo): return 0;
}
} )
Результат работы программы представлен на рис. 7.1.
І'-' D:\CSharpBook\Lab5\ChapterБ\
ккмхт» Uarioua stats about Foo
Full name is S T he Type .Foo
Base is: System. Object
Is it abstract? False
Is it a COtt object? False
Is it sealed? False
Is it a class? True
JQlJlI
***** Methods of Foo !ниш Method: Methode Method: HethodH Method: CetHashCode Method: Ециаіз Methud = ToString Method: piyMethod Method: getjiyProp Method: setJIyProp Method: • k-t I .міч
[¦****** Fields of Foo « Field: mylntField Field: nyStr IneFie lit
Properties of Foo Prop: MyProp
"ний» Interfaces of Foo * Interface: IFaceQne Interface: IFaceTuo
.¦¦.¦.- l-.'-,; to r:.»it. im<«
M
Рис. 7.1. Рефлексия для класса Foo
Интересно, не правда ли? Класс System. Тузе позволяет получать очень ценную информацию о типах в наших программах. Однако, как мы увидим, типы пространства имен Systen Rer.ect.ior позволяют еще больше расширить возможности рефлексии в С#.
Код приложения TheType можно найти в подкаталоге Chapter 7.
Типы пространства имен System.Reflection
Как и любое другое пространство имен, содержит набор типов,
обладающих схожей областью применения. Наиболее важные из этих типов представлены в табл. 7.2. С применением некоторых из них мы уже познакомились в нашем предыдущем примере.
Загрузка сборки 321
Таблица 7.2. Некоторыетипы пространства имен System.Reflection
Тип Назначение
Assembly Этот класс (вместе с многочисленными взаимосвязанными типами) содержит
методы для загрузки и изучения сборки, а также выполнения с ней различных
операций
AssemblyName Этот класс позволяет получать информацию об идентификации сборки
(информацию о версии, естественном языке и т. п.)
Eventinfo Хранит информацию о событии
Fieldlnfo Хранит информацию о поле
Memberlnfo Абстрактный базовый класс, определяющий общие члены для Eventinfo,
Fieldlnfo, Methodlnfo и Propertylnfo
Methodlnfo Хранит информацию о методе
Module Позволяет обратиться к модулю в многофайловой сборке
Parameterinfo Хранит информацию о параметре
Propertylnfo Хранит информацию о свойстве
Загрузка сборки
Обычно при использовании типов из System.Reil set і or значительную часть работы выполняет класс As s еnib 1 у. При помощи этого класса мы можем динамически загружать сборки, обращаться к членам класса в процессе выполнения (гогд5Ъ*е связывание), а также получать информацию о самой сборке.
Предыдущая << 1 .. 127 128 129 130 131 132 < 133 > 134 135 136 137 138 139 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100