Атрибуты

В языке имеется ограниченное число стандартных атрибутов, задаваемых ключевыми словами - например: атрибуты уровня доступа 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.