Программирование >>  Обработка исключительных ситуаций 

1 ... 89 90 91 [ 92 ] 93 94 95 ... 142


Результаты работы программы совпадают с полученными в листинге 8.3. Анализ каталога ...\bin\Debug показывает, что среда создала в нем копию библиотеки MonsterLib.dll, то есть поместила библиотеку в тот же каталог, что и исполняемый файл. Если скопировать эти два файла в другое место, программа не потеряет своей работоспособности - главное, чтобы оба файла находились в одном каталоге.

Допускается также, чтобы частные сборки находились в подкаталогах основного каталога приложения.

ПРИМЕЧАНИ Е-*-

Преимущество .NET состоит в том, что благодаря стандартным соглашениям можно использовать библиотеки независимо от языка, на котором они были написаны. Таким образом, можно было бы написать клиентское приложение, например, на языке VB.NET.

Рефлексия

Рефлексия - это получение информации о типах во время выполнения программы. Например, можно получить список всех классов и интерфейсов сборки, список элементов каждого из классов, список параметров каждого метода и т. д. Вся информация берется из метаданных сборки. Для использования рефлексии необходимы класс System.Туре и типы пространства имен System.Reflection.

Листинг 12.2. Клиентское приложение

using System; -

namespace ConsoleApplicationi

using MonsterLib:

class Classl { static void MainO {

const int n = 3;

MonsterC] stado = new Monster[n]:

stado[0] = new MonsterC Monia ); stadoll] = new MonsterC Mo ); stado[2] = new Daemon ( Dimon , 3 );

foreach ( Monster elem in stado ) elem. PassportO;

for ( int i = 0; i < n; ++i ) stado[i].Ammo = 0; Console.writeLineO;

foreach ( Monster elem in stado ) elem.PassportO;



В классе Туре описаны метод1, которые позволяют получить информацию о типах. В пространстве имен System.Reflection описаны тип1, поддерживающие Туре, а также классы, которые служат для организации позднего связывания и динамической загрузки сборок.

Наиболее важные свойства и методы класса Туре приведены в табл. 12.1.

Таблица 12.1. Элементы класса Туре

Элемент

IsAbstract, IsArray, IsNestedPublic, IsClass, IsNestedPrivate, IsCOMObject, IsEnum, Islnterface, IsPrimitive, IsSealed, IsValueType

GetConstructors, GetEvents, GetFields, Get Interfaces, GetMethods, GetMembers, GetNestedTypes, GetProperties

FindMembers

GetType

InvokeMember

Описание

Свойства, позволяющие получить соответствующие характеристики конкретного типа в программе (например, является ли он абстрактным, является ли он массивом, классом и т. п.). Приведен! не все свойства

Методы, возвращающие массив с набором соответствующих элементов (конструкторов, собттий, полей и т. п.). Возвращаемое значение соответствует имени метода, например, GetFields возвращает массив типа Fieldlnfo, GetMethods - массив типа Method Info. Для каждого из методов есть парн1й ему (без символа S в конце имени), который предназначен для работы с одним заданным в параметре элементом (например, GetMethod и GetMethods)

Метод возвращает массив типа Member Info на основе заданных критериев поиска

Метод возвращает объект типа Туре по имени, заданному в виде строки

Метод используется для позднего связывания заданного элемента

Воспользоваться этими методами можно после создания экземпляра класса Туре. Поскольку это абстрактный класс, обычный способ создания объектов с помощью операции new неприменим, зато существуют три других способа:

1. В базовом классе object описан метод GetType, которым можно воспользоваться для любого объекта, поскольку он наследуется. Метод возвращает объект типа Туре, например:

Monster X = new MonsterC); Type t = X.GetTypeO;

2. В классе Type описан статический метод GetType с одним параметром строкового типа, на место которого требуется передать имя класса (типа), например:

Type t = Type.GetTypeC Monster );

3. Операция typeof возвращает объект класса Туре для типа, заданного в качестве параметра, например:

Type t = typeofС Monster );



При использовании второго и третьего способов создавать экземпляр исследуемого класса нет необходимости.

Как видно из табл. 12.1, многие методы класса Туре возвращают экземпляры стан-дартнгх классов (например, Memberlnfo). Эти классы описаны в пространстве имен System. Ref lection. Наиболее важные из этих классов перечислены в табл. 12.2.

Таблица 12.2. Некоторые классы пространства имен System.Reflection Тип Описание

Assembly Содержит методы для получения информации о сборке, а также

для загрузки сборки и выполнения с ней различных операций

AssemblyName Позволяет получать информацию о сборке (имя, версия,

совместимость, естественный язык и т. п.)

EventInfo Хранит информацию о собттии

Fieldlnfo Хранит информацию о поле

Memberlnfo Абстрактн1й базов1й класс, определяющий общие элементе!

для классов Eventlnfo, Fieldlnfo, Methodlnfo и Propertylnfo

Methodlnfo Хранит информацию о методе

Module Позволяет обратиться к модулю в многофайловой сборке

Parameterlnfo Хранит информацию о параметре

Propertylnfo Хранит информацию о свойстве

В листинге 12.3 приведены примеры использования рассмотренных методов и классов для получения информации о классах библиотеки из листинга 12.1.

Листинг 12.3. Получение информации о классах

using System;

using System.Reflection;

namespace ConsoleApplicationl

using MonsterLib; class Classl

{ static void InfoC Type t )

Console.WriteLineC = = = = Класс + t.FullName ) ;

if ( t.IsAbstract ) Console.WriteLineC абстрактный );

if ( t.IsClass ) Console.WriteLineC обычный );

if ( t.IsEnum ) Console.WriteLineC перечисление );

Console.WriteLineC базовый класс + t.BaseType );

MethodInfo[] met = t.GetMethodsO;

foreach ( Methodlnfo m in met ) Console.WriteLineC m ); Console.WriteLineC): продолжение .



1 ... 89 90 91 [ 92 ] 93 94 95 ... 142

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика