Атрибут поддерживается классом, наследующим от классаSystem. Attribute.Поэтому классы атрибутов должны быть подклассами классаAttribute. В классе Attribute определены основные функциональные возможности, но далеко не все они нужны для работы с атрибутами. В именах классов атрибутов принято употреблять суффикс Attribute. Например, ErrorAttribute — это имя класса атрибута, описывающего ошибку.
При объявлении класса атрибута перед его именем указывается атрибутAttributeUsage.Этот встроенный атрибут обозначает типы элементов, к которым может применяться объявляемый атрибут. Так, применение атрибута может ограничиваться одними методами.
Создание атрибута
В классе атрибута определяются члены, поддерживающие атрибут. Классы атрибутов зачастую оказываются довольно простыми и содержат небольшое количество полей или свойств. Например, атрибут может определять примечание, описывающее элемент, к которому присоединяется атрибут. Такой атрибут может принимать следующий вид.
[AttributeUsage(AttributeTargets.All) ] public class RemarkAttribute : Attribute {
string pri_remark; // базовое поле свойства Remark
public RemarkAttribute(string comment) { pri_remark = comment;
}
public string Remark { v get {
return pri_remark;
}
}
}
Проанализируем этот класс атрибута построчно.
Объявляемый атрибут получает имяRemarkAttribute.Его объявлению предшествует встроенный атрибутAttributeUsage,указывающий на то, что атрибутRemarkAttributeможет применяться ко всем типам элементов. С помощью встроенного атрибутаAttributeUsageможно сузить перечень элементов, к которым может присоединяться объявляемый атрибут. Подробнее о его возможностях речь пойдет далее в этой главе.
Далее объявляется классRemarkAttribute,наследующий от классаAttribute.В классеRemarkAttributeопределяется единственное закрытое полеpri_remark,поддерживающее одно открытое и доступное для чтения свойствоRemark.Это свойство содержит описание, связываемое с атрибутом. (Конечно,Remarkможно было бы объявить как автоматически реализуемое свойство с закрытым аксессоромset,но ради наглядности данного примера выбрано свойство, доступное только для чтения.) В данном классе определен также один открытый конструктор, принимающий строковый аргумент и присваивающий его свойствуRemark.Этим пока что ограничиваются функциональные возможности классаRemarkAttribute,готового к применению.
Присоединение атрибута