В языке имеется ограниченное число стандартных атрибутов, задаваемых ключевыми словами - например: атрибуты уровня доступа public, private и protected, атрибуты static, virtual и override для методов.
Пользовательские атрибуты (далее просто атрибуты) - специальные языковые конструкции, позволяющие помечать классы, методы, подпрограммы, параметры некоторым именем (возможно с параметрами).
Например, для механизма сериализации класс помечается атрибутом [Serializable], а поля, которые не следует сериализовывать, атрибутом [NonSerialized]. При Unit-тестировании тестовый метод помечается атрибутом [Test] или атрибутом [TestCase]. Распознаются атрибуты методом отражения (рефлексии).
Атрибут - это обычный класс, унаследованный от System.Atribute. Например:
type AuthorAttribute = class(System.Attribute)
auto property Name: string;
constructor (n: string);
begin
Name := n;
end;
end;
Следует обратить внимание, что класс атрибута принято оканчивать на
Attribute.
При пометке сущности атрибутом имя атрибута заключается в квадратные скобки. Конструктор атрибута предоставляет
также возможность использовать атрибуты с
параметрами. Например, можно пометить класс
атрибутом AuthorAttribute.
[Author('Alex')]
type My = class
// ...
end;
Следует обратить внимание, что окончание Attribute можно не
указывать.
Распознать, помечен ли данный класс атрибутом, можно, используя анализ типа:
begin
var t := typeof(My);
var attrs := t.GetCustomAttributes(false);
foreach var attr in attrs do
if attr is AuthorAttribute (var auth) then
Print(auth.Name);
end.