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

 

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

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

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 135 136 137 138 139 140 < 141 > 142 143 144 145 146 147 .. 320 >> Следующая

Такая возможность С# не является CLS-совместимой, и другие языки .NET могут ее не поддерживать.
Как ограничить использование атрибута определенными типами
Наш пользовательский атрибут Vehi pti mAtnbute можно использовать для
самых разных целей. С точки зрения компилятора вполне допустимым будет применение атрибута не к классу, а к методу этого меласса:
// Ценного странный способ использования пользовательского атрибута, но вполне
//допустимый
public class Wionebago
{
[VehicleDescr-iptionAttribute] // Вызываем конструктор по умолчанию
public void TurnOnRadioO
{
}
}
Существует множество ситуаций, когда возможность ограничить виды типов и членов типов, к которым можно применять атрибуты, заранее определенным списком, будет очень полезна. Для этой цели м ожно использовать перечисление
AttributeTargets:
// Это перечисление позволяет определить, к чеку южно будет применять пользовательский атрибут
public enum AttributeTargets
{
All.
Assembly. Class,
Constructor,
Delegate,
Enum,
Event.
Field,
Interface,
Method,
Module.
Parameter,
Property.
ReturnValue.
Struct.
}
Значения передаются как параметры для атрибута Attn'buteUsage. Этот встроенный атрибут используется компилятором С# для проверки типов, к которым можно применять данный атрибут. Первый параметр Attributeusage - это одно или несколько приведенных выше элементов перечисления AttributeTarget, второй (необязательный) - это именованный аргумент AllowMultipIe1 который определяет, может ли этот аргумент применяться к одному и тому же типу несколько раз. Третий (тоже необязательный) параметр типа bool определяет, должен ли этот атрибут наследоваться производными классами.
Таким образом, если мы хотим, чтобы VehicleDescn'ptionAttribute мог применяться только к классам или структурам, его определение может выглядеть так;
Создание пользовательских атрибутов 339
// Применяем дпя нашего пользовательского атрибута встроенный атрибут AttributeUsage [AttributeUsage(Attr1buteTargets.Class J AttrlbuteTargets.Struct)] public class VehicleDescriptionAttribute : System.Attribute
private string description; public string Desc
get { return description; } set ( description = value; }
}
pubHcVehicleUescfipticnAtthbutefstring desc)
{ description - desc; }
public VehicleDescript1onAttributeO{}
І
Теперь, если попробуем применить VehicleDescriptionAttributeK методу, ком пилятор выдаст сообщение об ошибке (рис. 7.12),
I TaskШ 1 Cwitfe'E n't'.' ?!:'€¦..' :l-:'>ri |r>eiedl : :
! Descrptlcn
0\& h*r* ю *JrJ і new tssJ-
Attribute 'VehicleDeseriptiorrtttnPute' is not valid on this declaration type, jt is valid on 'Class, Struct' declarations only. ,
"I ...-...„VjJ jj
;0 Task LlSt-I 111 Output .? Index Results © Search Resets : ¦
Рис. 7.12. Ограничение использования атрибута
Атрибуты уровня сборки и модуля
Вполне возможно применять атрибуты сразу ко всем типам модуля или ко всем модулям сборки. Для этого используются встроенные атрибуты [module: 3 и [assembly:].
Например, предположим, что мы хотим сообщить, что все типы в нашей сборке соответствуют спецификации Common Language Specification (CLS). Выглядеть это может так:
// Іараїпируем ..'••<. - с
using System;
[as sembl у; System, Cl sCompl 1 antAttM bute( true) ]
namespace MyAtT r і bu ues {
[VehicleOescriptlonAttributeCAvery long, slow but feature rich auto")]
public class Winnebago
(
public WinnebagoOO
Сети же мы теперь попытаемся добавить код, несовместимый с CLS, например, такой:
340 Глава 7 Рефлексия типов и программирование с использованием атрибутов
fr<i«k List I >'<!>ii|rih-/Oi>iM.-'neploytask shown (Jul* Ї7-I)
I I I |g I Description
СІВ гвннп aid •i r»w '»*
' ф Type of My Amte*«*. Winne!» en. notCora pitenf is notCLS-cciiplert Hl I
E Task List | ® crea'pjinif
Рис. 7.13. При установленном атрибуте CLSCommliant несовместимые с CLS типы приводят к ошибке компилятора
Атрибут [CLSCompl і ant] в .NF.T является примерным эквивалентом атрибута [Oleautomation] в IDL. Этот атрибут IDL гарантирует, что все члены интерфейса являются совместимыми с типом VARIANT и те.\ самым к ним можно будет обратиться из любого СОМ-сопмест] їмо го языка программирования.
Атрибут [assembly:] позволяет сообщить компилятору, что атрибут [CLSCompl і ant] ¦относится ко всем без исключения типам этой сборки. Таким образом, отпадает необходимость применения этого атрибута ко всем типам сборки. Еще один важный момент, наготорыйследуетобязателыюобратитьвнимание: атрибуты [asss*1y:]ii [module: ] должны обязательно находиться за пределами пространств имен.
Файл AssemblyInfo.es
В любом проекте С# интегрированная среда разработки Visual Studio.NET автоматически создает файл Assemblylnrb.cs. Этот файл является местом размещения множества атрибутов уровня сборки. Наиболее важные из этих атрибутов представлены в табл. 7.6.
Таблица 7.6. Некоторые атрибуты уровня сборки
Предыдущая << 1 .. 135 136 137 138 139 140 < 141 > 142 143 144 145 146 147 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100