Net framework 5, а также среды Visual Studio 2012 и C#



Download 6,27 Mb.
Pdf ko'rish
bet343/658
Sana12.06.2023
Hajmi6,27 Mb.
#950840
1   ...   339   340   341   342   343   344   345   346   ...   658
Bog'liq
CLR via C Programmirovanie na platforme Microsoft NET Framework 4 5 na yazyke C


Глава.18 .Настраиваемые.атрибуты
То есть после определения собственных классов атрибутов нужно также напи-
сать код, проверяющий, существует ли экземпляр класса атрибута (для указанных 
элементов), и в зависимости от результата меняющий порядок выполнения про-
граммы. Только в этом случае настраиваемый атрибут принесет пользу!
Проверить наличие атрибута в FCL можно разными способами. Для объектов 
класса 
System.Type
можно использовать метод 
IsDefined
, как показано ранее. Но 
иногда требуется проверить наличие атрибута не для типа, а для сборки, модуля или 
метода. Остановимся на методах класса 
System.Reflection.CustomAttribute-
Extensions
. Именно он является базовым для CLS-совместимых атрибутов. В этом 
классе для получения атрибутов имеются три статических метода: 
IsDefined

GetCustomAttributes
и 
GetCustomAttribute
. Каждый из них имеет несколько 
перегруженных версий. К примеру, одна версия каждого из методов работает с чле-
нами типа (классами, структурами, перечислениями, интерфейсами, делегатами, 
конструкторами, методами, свойствами, полями, событиями и возвращаемыми 
типами), параметрами и сборками. Также существуют версии, позволяющие про-
сматривать иерархию наследования и включать в результат наследуемые атрибуты. 
Краткое описание методов дано в табл. 18.1.
таблица 18.1. 
Методы.класса.System Reflection CustomAttributeExtensions,.
определяющие.наличие.в.метаданных.CLS-совместимых.
настраиваемых.атрибутов
Метод
Описание
IsDefined
Возвращает значение true при наличии хотя бы одного экзем-
пляра указанного класса, производного от Attribute, связанного 
с целью. Работает быстро, так как не создает (не десериализует) 
никаких экземпляров класса атрибута
GetCustomAttributes Возвращает массив, каждый элемент которого является эк-
земпляром указанного класса атрибута. Каждый экземпляр 
создается (десериализуется) с использованием указанных при 
компиляции параметров, полей и свойств. Если цель не имеет 
экземпляров указанного класса атрибута, метод возвращает 
пустую коллекцию. Обычно метод используется с атрибутами, 
параметр AllowMultiple которых имеет значение true, или со 
списком всех примененных атрибутов
GetCustom Attribute
Возвращает экземпляр указанного класса атрибута. Каждый 
экземпляр создается (десериализуется) с использованием 
указанных при компиляции параметров, полей и свойств. 
Если цель не имеет экземпляров указанного класса атри-
бута, метод возвращает null. При наличии более чем одного 
экземпляра генерируется исключение System.Reflection.
AmbiguousMatchException. Обычно метод работает с атрибута-
ми, параметр AllowMultiple которых имеет значение false


475
Выявление.настраиваемых.атрибутов
Если нужно установить только сам факт применения атрибута, используйте 
метод 
IsDefined
как самый быстрый из перечисленных. Однако при применении 
атрибута, как известно, можно задавать параметры его конструктору и при необхо-
димости определять свойства и поля, а этого метод 
IsDefined
делать не умеет.
Для создания объектов атрибутов используйте метод 
GetCustomAttributes
или 
GetCustomAttribute
. При каждом вызове этих методов создаются экземпляры 
указанных классов атрибутов, и на основе указанных в исходном коде значений 
задаются поля и свойства каждого экземпляра. Эти методы возвращают ссылки на 
сконструированные экземпляры классов атрибутов.
Эти методы просматривают данные управляемого модуля и сравнивают стро-
ки в поиске указанного класса настраиваемого атрибута. Эти операции требуют 
времени, поэтому если вас волнует быстродействие, подумайте о кэшировании 
результатов работы методов. В этом случае вам не придется вызывать их раз за 
разом, запрашивая одну и ту же информацию.
В пространстве имен 
System.Reflection
находятся классы, позволяющие ана-
лизировать содержимое метаданных модуля: 
Assembly

Module

ParameterInfo

MemberInfo

Type

MethodInfo

ConstructorInfo

FieldInfo

EventInfo

PropertyInfo
и соответствующие им классы 
*Builder
. Все эти классы содержат методы 
IsDefined
и 
GetCustomAttributes
.
Версия метода 
GetCustomAttributes
, определенная в классах, связанных с от-
ражением, возвращает массив экземпляров 
Object
(
Object[]
) вместо массива 
экземпляров типа 
Attribute
(
Attribute[]
). Дело в том, что классы, связанные 
с отражением, могут возвращать объекты из классов атрибута, не соответствующих 
спецификации CLS. К счастью, такие атрибуты встречаются крайне редко. За все 
время моей работы с .NET Framework я не сталкивался с ними ни разу.

Download 6,27 Mb.

Do'stlaringiz bilan baham:
1   ...   339   340   341   342   343   344   345   346   ...   658




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish