Атрибуты

Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску

В данном примере иллюстрируется создание пользовательского атрибута, пометка этим атрибутом класса и вывод значения атрибута для нескольких классов (используется механизм рефлексии)

uses System;

type
  Author = class(Attribute) // определение класса атрибута
  private
    _name: string;
  public 
    constructor (name: string);
    begin
      _name := name;
    end;
    property Name: string read _name;
  end;
  
  [Author('Иванов И.И.')] // пометка класса атрибутом 
  MyClass=class
    procedure Print();
    begin
      write('MyClass');
    end;
  end;

  [Author('Петров П.П.')] 
  MyClass1=class
    procedure Print();
    begin
      write('MyClass1');
    end;
  end;

// Вывод информации об авторе для данного типа. Используется механизм рефлексии
procedure PrintAuthorInfo(t: System.Type);
begin
  write('Информация об авторе для типа ', t.Name,': ');
  var attrs: array of Attribute := Attribute.GetCustomAttributes(t); // получение атрибутов с помощью рефлексии
  foreach attr: Attribute in attrs do
    if attr is Author then
    begin
      var a := Author(attr);
      writeln(a.Name);
    end;
end;


begin
  PrintAuthorInfo(typeof(MyClass)); 
  PrintAuthorInfo(typeof(MyClass1)); 
  PrintAuthorInfo(typeof(integer)); 
end.

Ссылки