Г. Шилдт - С#4.0 Полное руководство (1160795), страница 103
Текст из файла (страница 103)
Свойство Назначение АваептЬ1у АвзептЬ1у ТуреАССг1Ьигев АССг1Ьпгев Туре ВазеТуре Полу~ает сборку для заданного типа Получает атрибуты для заданного типа Получает непосредственный базовый тип для заданно- го типа Получает полное имя заданного типа Истинно, если заданный тип является абстрактным Истинно, если заданный тип является массивом Истинно, если заданный тип является классом Истинно, если заданный тип является перечислением Истинно, если заданный тип является параметром обобщенного типа. (Более подробно обобщения рас- сматриваются в главе 18.) Истинно, если заданный тип является обобщенным. (Бо- лее подробно обобщения рассматриваются в главе 18.) Получает пространство имен для заданного типа агггпо Ри11напге Ьоо1 1зАЬзггасг Ьоо1 гздггау Ьоо1 1зС1авз Ьоо1 1зЕпип Ьоо1 1збепег1сРагагпегег Ьоо1 1воепег1стуре зсг1пд напгезрасе Применение рефлексии С помощью методов и свойств класса Туре можно получить подробные сведения о типе данных во время выполнения программы.
Это довольно эффективное средство. Ведь получив сведения о типе данных, можно сразу же вызвать его конструкторы и методы или воспользоваться его свойствами. Следовательно, рефлексия позволяет использовать код, который не был доступен во время компиляции. Прикладной интерфейс Кейесбоп АР! весьма обширен и поэтому не может быть полностью рассмотрен в этой главе.
Ведь для этого потребовалась бы целая книга! Но прикладной интерфейс Кейес((оп АР! имеет ясную логическую структуру, а следовательно, уяснив одну его часть, нетрудно понять и все остальное. Принимая во внимание это обстоятельство, в последующих разделах демонстрируются четыре основных способа применения рефлексии: получение сведений о методах, вызов методов, конструирование объектов и загрузка типов данных из сборок.
544 Часть!. Язык С№ Получение сведений о методах Имея в своем распоряжении объект класса Туре, можно получить список методов, поддерживаемых отдельным типом данных, используя метод йесиеГЬо<(я () . Ниже приведена одна из форм, подходящих для этой цели. Неспоо1пго () йесиеспог(я () Этот метод возвращает массив объектов класса МегЬо<(1п1о, которые описывают методы, поддерживаемые вызывающим типом. Класс МеГЬоа1пго находится в пространстве имен оуягещ. не(1есггогь Класс метье<)1пго является производным от абстрактного класса МеГЬо<(Вазе, кО- торый в свою очередь наследует от класса Мещбе г1пТо. Это дает возможность пользоваться всеми свойствами и методами, определенными в этих трех классах.
Например, для получения имени метода служит свойство Маще. Особый интерес вызывают два члена класса мегьог(1пГо: негигптуре и оегРагащегегя [) . Возвращаемый тип метода находится в доступном только длл чтения свойстве Несигптуре, которое является объектом класса Туре. Метод йеграгащесегя () возвращает список параметров, связанных с анализируемым методом.
Ниже приведена его общая форма. Рагащесеггпто() цеГРагащесегя()г Сведения о параметрах содержатся в объекте класса Рагащесег1пго. В классе Рагаиесег1п1о определено немало свойств и методов, описывающих параметры. Особое значение имеют два свойства: наще — представляет собой строку, содержащую имв параметра, а Рагащесегтуре — описывает тип параметра, который инкапсулирован в объекте класса Туре. В качестве примера ниже приведена программа, в которой рефлексии используется для получения методов, поддерживаемых классом МуС1аяя. В этой программе выводится возвращаемый тип и имя каждого метода, а также имена и типы любых параметров, которые может иметь каждый метод. Анализ методов о помощью рефлексии.
ия1пи Зуягещг иягпо Бувсещ.ре11еосьоп; с1аяя МуС1аяя ( ьпс х; гпг у; рипгго МуС1аяя(гпс г, 1пс 3) ( к у = 3: ) риЬ11о гпс Зищ() ( гегигп хеу; ) риЬ11о Ьоо1 1яаеснееп(1пс 1) ( 11(х < г БГ 1 < у) гесигп Ггие; е1яе гесигп Га1яе; Глава 1у. динамическая идентификация типав, рефлексия и атрибуты 545 роЬ11с чо1д Яег(впс а, Тпг Ь) ( х= а; у=ь; ) рпЬ11с чо1д Вес(допЬ1е а, дооЬ1е Ь) х = (гпг) а; у = (дпг) Ь; ) рпЬ11с чо1д ЯЬои() Сопяо1е.нггсеЬ1пе(" х: (О), у: (1)", х, у); ) с1аяя Ве11ессоемо ( ясатгс чогд Маго() ( Туре Г = Суреог(Мус1аяя); О получить объект класса Туре, /! представлнпций класс МуС1аяя Сопяо1е.игдге11пе("Анализ методов, определенных "в классе " + Г..Хазе); Сопяо1е.иглтепдпе(); Сопяо1е.иггоевепе("Поддерживаемые методы: ") Меслод1пго[] з1 = г.ееснеслодя(); О Вывести методы, поддерживаемые в классе Мус1аяя.
Тогеасл(Меолодтпто е гп и1) ( Вывести возврашаемый тип и имв каждого метода. Сопяо1е.игдге(" " т з.несогпТуре.Мазе + " " + т.Нате + "(") !/ Вывести параметры. Рагазесег1пго[) р1 = е.веГРагаиесегя()2 РОГ(1ПГ 1=02 Г < РТ.ЬЕППГЬ2 1++) ( сопяо1е.хг1ге(р1[1].Рагаиегегтуре.Мазе + " " + рд[г).Хазе); 11(г+1 < р1.ЬепдСЬ) Сопяо1е.иг1се(", "); ) Сопяо1е.Хг).се1,1пе(")"); Сопяо1е.иггсевапе()2 ) Эта программа дает следующий результат. Анализ методов, определенных в классе МуС1аяя Поддерживаемые методы: гпс32 Яоз() 546 Часть!. Язык С№ Воо1еап 1яВесиееп(1пс32 з) уо1б Яес(1пг32 а, 1пс32 Ь) уо1б яег(оооь1е а, оопь1е ь) Уо1б Ялом () Ясгзпэ Тозсгзпэ() Воо1еап ВЧпа1в(ОЬ]есс оЬ]) гпс32 ЯеснаяЬСобе() Туре яестуре() Как видите, помимо методов, определенных в классе МуС1ая я, в данной программе выводятся также методы, определенные в классе оЬ3 есг, поскольку все типы данных в С№ наследуют от класса оЬ3 еск.
Кроме того, в качестве имен типов указываются имена структуры .]<]ЕТ. Обратите также внимание на то, что метод Яес ( ) выводится дважды, поскольку он перегружается. Один из его вариантов принимает аргументы типа 1пс, а другой — аргументы типа <(опЬ1е. Рассмотрим эту программу более подробно. Прежде всего следует заметить, что в классе МуС1а я я определен открытый конструктор и ряд открытых методов, в том числе и перегружаемый метод Яег () . Объект класса Туре, представляющий класс МуС1аяя, создается в методе Маьп () в следующей строке кода. Туре С = Гуреос(Мус1аяя)З // получить объект класса Туре, // представляющий класс МуС1аяв Напомним, что оператор Суреог возвращает объект класса Туре, представляющий конкретный тип данных (в данном случае — класс Мус1а я я).
С помощью переменной с и прикладного интерфейса не(]есс1оп АР1 в данной программе затем выводятся сведения о методах, поддерживаемых в классе МуС1аяя. Для этого в приведенной ниже строке кода сначала выводится список соответствующих методов. мегьоб1пго[] тз = г.песмегьобя()з Затем в цикле №огеасЬ организуется обращение к элементам массива т1. На каждом шаге этого цикла выводится возвращаемый тип, имя и параметры отдельного метода, как показано в приведенном ниже фрагменте кода.
Гогеасп(неспоб1пто т зп тз) ( Вывести возвращаемый тип и имя каждого метода. Сопво1е.нгзсе(" " + в.кеспгпТуре.нате + " " + в.нате + "(") Вывести параметры. Рагавегег1пго[] рз = в.СегРагавегегя()з Гог(гпг з=с; з < р1.Ьепчспз 1++) ( Сопяо1е.нггге(рз[з].РагавегегТуре.нате е " " + рз[з).нате); 11(зь1 < РЬ.Ьепдсп) Сопво1е.Иг]се(", "); Глава 17.
Динамическая идентификация типов, рефлексия и атрибуты 547 В этом фрагменте кода параметры, связанные с каждым методом, сначала создаются с помощью метода Песрагаюегегв () и сохраняются в массиве р1. Затем в цикле гог происходит обращение к элементам массива р1 и выводится тип и имя каждого параметра. Самое главное, что все эти сведения создаются динамически во время выполнения программы, не опираясь на предварительную осведомленность о классе МУС1азв. Вторая форма метода Оегв)еЬ)тос)в () Существует вторая форма метода бегнеСЬог)в (), позволяющая указывать различные флажки для отфильтровывания извлекаемых сведений о методах. Ниже приведена эта общая форма метода Вегиегиос)в () . Меопог)1пго() Певнебпог)в(В1пб1пэр1адв флажки) В этом варианте создаются только те методы, которые соответствуют указанным критериям.
В1пс)1пдр1аоз представляет собой перечисление. Ниже перечислен ряд наиболее часто используемых его значений. Описание Значение Вес1агег)Оп1у Извлекаются только те методы, которые определены а заданном классе. Унаследованные методы в извлекаемые сведения ие включаются Извлекаются методы экземпляра Извлекаются методы, ие являющиеся открытыми Извлекаются открытые методы Извлекаются статические методы 1пвгапсе МопрпЬ11с РпЬ11с Ябагьс // Теперь получаются сведения только о тех методах, которые объявлены в классе МуС1авв.
Мевпоб1пго[) юг = с.сегнегпобв(вгпбгпог1апв.пес1агес)бп1у В1пбьпдг1аэв.1пвгапсе В1пбгпор1аов.рпЬ11с); После этой замены программа дает следующий результат. Анализ методов, определенных в классе МуС1авв Поддерживаемые методы: гпСЗ2 Зчю() Воо1еап 1ввегнееп(1пг32 1) Два или несколько флажков можно объединить с помощью логической операции ИЛИ. Но как минимум флажок 1пвсапсе или Всасфс следует указывать вместе с флажком РиЬ11с или поп РиЬ11с.