Применение атрибутов

Предположим, классы проекта, над которым работает группа, должны снабжаться примечаниями. Текст примечаний можно сохранить в базе данных, что позволит легко организовать обработку запросов о состоянии работы. Кроме того, примечания можно оформить в виде комментариев, чтобы получать информацию по мере просмотра программного кода.

А можно воспользоваться атрибутами, в результате чего станут возможными оба способа получения информации.

Для этого вам понадобится класс атрибута. Класс атрибута определяет имя атрибута, способ его создания и способ хранения информации. Определение классов атрибутов более подробно рассматривается в разделе «Пользовательские атрибуты».

Класс атрибута выглядит примерно так:

using System;

[AttributeUsage(AttributeTargets.Class)]

public class CodeReviewAttribute: System.Attribute

{

public CodeReviewAttribute(string reviewer, string date)

{

this.reviewer = reviewer;

this.date = date;

}

public string Comment

{

get

{

return(comment);

}

set

{

comment = value;

}

}

public string Date

{

get

{

return(date);

}

}

public string Reviewer

{

get

{

return(reviewer);

}

}

string reviewer;

string date;

string comment;

}

[CodeReview("Eric", "01-12-2000", Comment="Bitchin' Code")]

class Complex

{

}

Атрибут AttributeUsage перед именем класса указывает, что данный атрибут может устанавливаться только для классов. При установке атрибута для некоторого элемента программы компилятор проверяет, возможно ли использование атрибута в данном контексте.

Согласно правилам выбора имен, имя класса атрибута завершается строкой Attribute. Это позволяет легко определить, какие классы являются классами атрибутов, а какие представляют собой обычные классы. Все классы атрибутов должны быть производными от System.Attribute.

У нашего класса имеется открытое свойство Comment и один конструктор, которому в качестве параметров передается имя рецензента и дата.

Когда компилятор находит атрибут, установленный для класса Complex, он сначала ищет класс, производный от Attribute, с именем CodeReview. Не обнаружив такого класса, он начинает искать класс CodeReviewAttribute. На этот раз поиск заканчивается успешно.

После этого компилятор проверяет, можно ли использовать данный атрибут для классов.

Затем начинается поиск конструктора, который бы соответствовал параметрам, указанным при установке атрибута. Если такой конструктор будет найден, компилятор создает экземпляр объекта вызовом конструктора с заданными параметрами.

При передаче именованных параметров компилятор сопоставляет имя параметра с именем переменной класса или свойства, после чего присваивает переменной или свойству указанное значение.

После завершения всех перечисленных операций текущее состояние класса атрибута сохраняется в метаданных того элемента программы, для которого был установлен атрибут.

Во всяком случае, так должно происходить на логическом уровне. О том, что же происходит в действительности, рассказано в разделе «Сохранение атрибутов».

Предлагаю ознакомиться с аналогичными статьями: