|
Программирование >> Программирование с использованием ajax
Создание конструкторов и свойств Как уже было отмечено, когда пользователи используют атрибут, они, по существу, вызывают конструктор атрибута. Для атрибута BugFix вероятно требуется записать номер исправленной ошибки и определенные комментарии: using Systems-public class BugFixAttribute : Attribute { public BugFixAttribute (string bugNuinber, string comments) { BugNumber = bugNumber; Comments = comments; public readonly string BugNumber; public readonly string Comments; Этот код определяет единственный конструктор и две доступные только для чтения переменные-члены BugNumber и Comments. Снабжение класса атрибутом, описывающим его назначение Последний шаг, который нужно выполнить - пометка класса атрибута и указание его возможного использования. Для атрибута BugFix нужно указать, что этот атрибут применим только к классам, свойствам, методам и конструкторам . Можно определить, где созданный атрибут допустим. Подробнее этот вопрос рассматривается далее в главе. [AttributeUsage (AttributeTargets. Class AttributeTargets. Property AttributeTargets.Method AttributeTargets.Constructor, Alloultiple = true, Inherited=false) ] public class BugFixAttribute : Attribute Атрибут AttributeUsage обладает единственным конструктором, который принимает значение от перечисления AttributeTargets (подробнее оно описано далее в этом разделе). Определение атрибута использует также два свойства атрибута - AllowMultiple и Inherited. Подробнее они освещены далее в настоящем разделе. Когда определение атрибута BugFix готово, можно приступить к оснащению им кода. Следующий фрагмент демонстрирует код, содержащий ряд исправлений программных ошибок: [BugFix ( 101 , Created some methods )] public class MyBuggyCode [BugFix ( 90125 , Removed call to baseO )] public MyBuggyCode0 [BugFix ( 2112 , Returned a non null string )] [BugFix( 38382 , Returned OK )] public string DoSomething () { Позднее в этой главе мы вернемся к атрибуту BugFix и добавим в него дополнительные функциональные возможности. System. AttributeUsageAttribute При определении класса пользовательского атрибута необходимо определить тип или типы, с которыми его можно применять. В предыдущем примере атрибут BugFix был применим только к классам, методам, свойствам и конструкторам. Чтобы определить объекты, в которые можно помещать атрибут, необходимо использовать еще один атрибут - AttributeUsage. В простейшей форме его применение выглядит следующим образом: [AttributeUsage(AttributeTargets.Class AttributeTargets.Property I AttributeTargets.Method I AttributeTargets.Constructor )] Единственный параметр - перечисление, определяющее объекты, в которых данный атрибут допустим. Попытка снабжения поля атрибутом BugFix приведет к генерированию компилятором сообщения об ошибке. Перечисление AttributeTargets определяет описанные в табл. 80.2 члены, которые можно объединять операцией логического ог( ) для определения набора элементов, допускающих использование атрибута. Таблица 30.2. Перечисление AttributeTargets Значение перечисления оп рян р AttributeTargets Описание Assembly Class Constructor Delegate Enum Event Field Interface Method Атрибут допустим для любого элемента внутри сборки Атрибут допустим для сборки - примером может служить ранее рассмотренный в этой главе атрибут AssemblyTitle Атрибут допустим для определения класса. Атрибут TestCase использует это значение. Еще один пример - атрибут Serializable Атрибут допустим только для конструкторов класса Атрибут допустим только для делегата Атрибут может быть добавлен к перечисленным значениям. Один из примеров этого атрибута - System. FlagsAttnbute, который при применении к enum определяет, что пользователь может использовать операцию побитового or для объединения значений, указанных в перечислении. AttributeTargets enum использует ЭТОТ атрибут Атрибут допустим для определений событий Атрибут может быть помещен в поле, такое как внутренняя переменная-член. Пример такого атрибута - NonSerialized, который ранее использовался для определения того, что конкретное значение не должно сохраняться при сериализации класса Атрибут допустим для интерфейса. Один из примеров такого атрибута - GuidAttribute, определенный внутри System.Runtime. interopServices, который позволяет явно определять глобально уникальный идентификатор (GUID) интерфейса Атрибут допустим для метода. Атрибут OneWay из System. Runtime. Remoting.Messaging использует ЭТО значение Окончание табл. 30.2 Значение перечисления ряныр AttributeTargets Описание Module Атрибут допустим для модуля. Сборка должна быть создана из ряда модулей кода, поэтому данное значение можно использовать для помещения атрибута в отдельный модуль, а не в целую сборку Parameter Атрибут может применяться к параметру внутри определения метода Property Атрибут может быть применен к свойству ReturnValue Атрибут связан с возвращаемым значением функции struct Атрибут допустим для структуры Область действия атрибута в ранее приведенных примерах этой главы встречались атрибуты Assembly*, синтаксически подобные следующему: [assembly: AssemblyTitle( AttributePeek )] Строка assembly: определяет область действия атрибута, которая в данном случае указывает компилятору, что атрибут AssemblyTitle должен применяться к самой сборке. Модификатор области действия нужно использовать, только если компилятор не может определить область действия самостоятельно. Например, может требоваться добавление атрибута к возвращаемому значению функции: [MyAttribute ()] public long DoSomething () Когда компилятор достигает этого атрибута, он принимает вполне обоснованное решение, что атрибут применяется к самому методу, что в данном случае не соответствует действительности. Поэтому можно добавить модификатор, явно указывающий, к чему именно присоединен атрибут: [return:MyAttribute ()] public long DoSomething () Чтобы определить область действия атрибута, выберите одно из перечисленных ниже значений: □ assembly - атрибут применяется к сборке; □ field - атрибут применяется к полю перечисления или класса; □ event - атрибут применяется к событию; □ method - атрибут применяется к методу, которому он предшествует; □ module - атрибут хранится в модуле; □ param - атрибут применяется к параметру; □ property - атрибут применяется к свойству; □ return - атрибут должен применятся к возвращаемому значению функции; □ type - атрибут применяется к классу, интерфейсу или структуре.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |