Г. Шилдт - С# 3.0 Полное руководство. 2010 (1160798), страница 101
Текст из файла (страница 101)
Для открыто сконструи- рованного типа этот список может содержать как аргументы, так и параметры типа. (Более подробно обобщения рассматриваются в главе 18.) Мевьег1пто[] Сетневьегя() Метьоп[1пго(] СеГМетьося О Рторегту1пгс (] СеГРгорегтьея () Получает список членов для заданного типа Получает список методов для заданного типа Получает список свойств для заданного типа Следовательно, тип члена можно определить, проверив свойство МевЬегтуре.
Так, если свойство мевЬегтуре имеет значение мевЬегтурез. мегпсп], то проверяемый член является методом. В класс МевЬег1пТо входят два абстрактных метода: БеГСиятовдстг1Ьигея () и 1я[)е11пеп](). Оба метода связаны с атрибутами. Первый из них получает список специальных атрибутов, имеющих отношение к вызывающему объекту, а второй устанавливает, определен ли атрибут для вызывающего метода.
(Подробнее об атрибутах речь пойдет далее в этой главе.) Класс туре добавляет немало своих собственных методов и свойств к числу тех, что определены в классе МевЬег1пго. В качестве примера ниже перечислен ряд наиболее употребительных методов класса Туре. Глава Ы, Динамическая идентификация типов, рефлексия и атрибуты 626 Далее приведен ряд наиболее употребительных свойств, доступных только для чтения и определенных в классе Туре. Свойство Назначение Ьоо1 тзпепегъсТуре зкг1пч Напезрасе Получает пространство имен для заданного типа Применение рефлексии С помощью методов и свойств класса туре можно получить подробные сведения о типе данных во время выполнения программы. Это довольно эффективное средство. Ведь получив сведения о типе данных, можно сразу же вызвать его конструкторы и методы или воспользоваться его свойствами.
Следовательно, рефлексия позволяет использовать код, который не был доступен во время компиляции. Прикладной интерфейс Ке()ес(!оп АР1 весьма обширен и поэтому не может быть полностью рассмотрен в этой главе. Ведь для этого потребовалась бы целая книга! Но интерфейс Кейест)оп АР1 имеет ясную логическую структуру, а следовательно, уяснив одну его часть, нетрудно понять и все остальное. Принимая во внимание это обстоятельство, в последующих разделах демонстрируются четыре основных способа применения рефлексии; получение сведений о методах, вызов методов, конструирование объектов и загрузка типов данных из сборок.
Получение сведений о методах Имея в своем распоряжении объект класса туре, можно получить список методов, поддерживаемых отдельным типом данных, используя метод пекмеспос)з () . Ниже приведена одна из форм, подходящих для этой цели. Мекпог)тото () Секиетьог)з () Этот метод возвращает массив объектов класса месьог)1пто, которые описывают методы, поддерживаемые вызывающим типом. Класс месьос(1пуо находится в пространстве имен 5узсегл. НеТ1есс1оп. АззеиЬ1у АзвеиЬ1у турейгегъьцеез йтсгъьикез Туре ВазеТуре эсг1по Ги11иапе Ьоо1 тзАЬзкгасС Ьоо1 Тзйггау Ьоо1 тзС1азэ Ьоо1 тзвпае Ьоо1 1эпепег1сгагапекег Получает сборку для заданного типа Получает атрибуты для заданного типа Получает непосредственный базовый тип для заданного типа Получает полное имя заданного типа Истинно, если заданный тип является абстрактным Истинно, если заданный тип является массивом Истинно, если заданный тип является классом Истинно, если заданный тип является перечислением Истинно, если заданный тип является параметром обобщен- ного типа.
(Более подробно обобщения рассматриваются, в главе!8.) Истинно, если заданный тип является обобщенным, (Более подробно обобщения рассматриваются в главе 18.) 526 Часть(. Язык С№ Класс Метпос(1пго является производным от абстрактного класса Меспойиаве, который в свою очередь наследует от класса МещЬег1пго. Это дает возможность пользоваться всеми свойствами и методами, определенными в этих трех классах. Например, для получения имени метода служит свойство нане. Особый интерес вызывают два члена класса Мегнос(1пго: НегпгпТуре и йеСРагащегегв().
Возвращаемый тип метода находится в доступном только для чтения свойстве Негигптуре, которое является объектом класса Туре. Метод бесРагащесегв () возвращает список параметров, связанных с методом. Ниже приведена его общая форма. Рагащегег1сго() яеСРагащегегв(); Сведения о параметрах содержатся в объекте класса Рагащегвг1пго.
В классе Рагащегег1п Ео определено немало свойств и методов, описывающих параметры. Особое значение имеют два свойства: нане — представляет собой строку,'содержащую имя параметра, а РагащесегТуре — описывает тип параметра, который инкапсулирован в объекте класса Туре. В качестве примера ниже приведена программа, в которой рефлексия используется доя получения методов, поддерживаемых классом Мус1авв. В этой программе выводится возвращаемый тип и имя каждого метода, а также имена и типы любых параметров, которые может иметь каждый метод. // Анализ методов с помощью рефлексии.
св1лд Яувсеги св1лс Яувгещ.ке11есг1ол) с1авв МуС1авв ( Тлг х) ълг у; рсь11с МуС1авв(глг 1, ълг №) ( х=).) У=3) ) рсвггс Тес Ясщ() ( гегсгс х+у; ) рсЬ11с Ьоо1 1внегиееп(1лг 1) ( 11(х < 1 ВВ 1 < у) гегсгл Сгсе~ е1ве гессгп га1ве; ) рсвггс то1С Яег(1лг а, Тлг Ь) ( х=а; у-Ь; ) рсЬ11с то1С Яег(носЬ1е а, с(осЬ1е Ь) ( х = (1лг) а; у = (глс) Ь; Глава ]7, Динамическая идентификация типов, рефлексия и атрибуты 627 рпЫ1с чо1б ЯЛом() ( Сопяо1е.игггепапе(" х: (0], у: (1)", х, у); ) с1аяя Вег1есгоещо ( ягагас чо16 Ма1п() ( туре г = гуреот(муС1аяя); // получить объект класса // Туре, представлякщий класс МуС1аяя Сопяо1е.ыгагедапе("Анализ методов, определенных " + "в классе " + г.иаще); Сопяо1е.ыгкгепапе()т сопяо1е.игагеЬ1пе("Поддерживаемые методы: ") меглопгпко[] щ1 = г.оегмеглобв()," // Вывести методы, поддерживаемые в классе МуС1аяя.
токеасп(мегпоб1пго щ 1п ща) ( // Вывести возвращаемый тип и имя каждого метода. Сопяо1е.иг1ге(" " + щ.хегпгпТуре.иаще + " " ч щ.каме ч "(")." // Вывести параметры. Рагащегег1пто[] ра = щ.пегРакащегекя()) Тог(1пг 1 О) 1 < р1.ьепдг]м 1++) ( Сопво1е.итаке(р1[1].РагащегекТуре.ыаще ч " " ч р].[1) .Иаще); 11(1+1 < ра.ьепдгщ Сопяо1е.иггге(", "); Сопяо1е.игагепапе(") ")) Сопяо1е.игагеЬ1пе()) ) ) ) Эта программа дает следующий результат: Анализ методов, определенных в классе МуС1аяя Поддерживаемые методы: 1пг32 Япщ() Воо1еап 1яВегнееп(1пг32 1) чола Яег(1пг32 а, 1пг32 Ы чокд Бег(Оопые а, Оопые ь) чокб Япои() 528 Часть [. Язык,СФ Згг1по Тоэггьпб() Воо1еап ЕЧоа1з (ОЬэесг оЬ11 тпС32 бегиазвсобе() туре бегтуре() Как видите, помимо методов, определенных в классе МуС1азз, в данной программе выводятся также методы,'определенные в классе оЬ1есС, поскольку все типы данных в С№ наследуют от класса оЬ1есС.
Кроме того, в качестве имен типов указываются имена структуры .НЕТ. Обратите также внимание на то, что метод Вес () выводится дважды, поскольку он перегружается. Один из его вариантов принимает аргументы типа Ьпг, а другой — аргументы типа бопЬ1е. Рассмотрим эту программу более подробно.
Прежде всего следует заметить, что в классе МуС1а аз определен открытый конструктор и ряд открытых методов, в том числе и перегружаемый метод БеС () . Объект класса туре, представляющий класс МуС1азз, получается в методе Мабп () в следующей строке кода: туре с = суреог(мус1азз)! // получить объект класса // Туре, представляющий класс МТС1азз Напомним, что оператор суреог возвращает объект класса туре, представляющий конкретный тип данных [в данном случае — класс МуС1азз).
С помощью переменной С и прикладного интерфейса Ве11есС1оп ВР1 в данной программе затем выводятся сведения о методах, поддерживаемых в классе МуС1азз. Для этого в приведенной ниже строке кода сначала получается список соответствующих методов. Мегьобгпко[) вь = С.бегнегвобз()т Затем в цикле гогеасЬ организуется обращение к элементам массива вг.
На каждом шаге этого цикла выводится возвращаемый тип, имя и параметры отдельного метода, как показано в приведенном ниже фрагменте кода. Йогеаов(иегьобтпго в 1п в1) ( // Вывести возвращаемый тип и имя каждого метода. Сопзо1е.игъге(" " + в.вегпгпТуре.паве + " " + в.паве т "(")т // Вывести параметры. РагавеСегтпсо[.) р1 = в.беСРагавегега()т Гог(1пг 1=0) 1 < РТ.Ьепдгвт 1++) ( Сопзо1е.иг1Се(рг[1!.РагавегегТуре.паве + " " + ръ[1).паве)т 11(1+1 < рб.ьепдСЬ) Сопео1е.игвге(", ")т ) В этом фрагменте кода параметры, связанные с каждым методом, сначала получаются с помощью метода беграгавегегз () и сохраняются в массиве р1. Затем в цикле аког происходит обращение к элементам массива рг и выводится тип и имя каждого параметра.
Самое главное, что все эти сведения получаются динамически во время выполнения программы, не опираясь на предварительную осведомленность о классе МуС1азз. Глава 17. Динамическая идентификация типов, рефлексия и атрибуты 529 В этом варианте получаются только те методы, которые соответствуют указанным критериям. Въпбупдр1адя представляет собой перечисление. Ниже перечислен ряд наиболее употребительных его значений.
Описание Значение Оес1агебол1у Извлекаются только те методы, которые определены в заданном классе. Унаследованные методы в извлекаемые сведения не включаются 1пягапсе НопРнЫ1с РоЫ1с зсасас Извлекаются методы экземпляра Извлекаются методы, не являющиеся открытыми Извлекаются открытые методы Извлекаются статические методы Два или более флажка можно объединить с помощью логической операции ИЛИ.