Какие языковые элементы могут быть аннотированы с использованием атрибутов языка Delphi? - PullRequest
30 голосов
/ 25 мая 2011

В Delphi 2010 появились пользовательские атрибуты, которые можно добавлять в объявления типов и методы.Для каких языковых элементов можно использовать пользовательский атрибут?

Примеры, которые я нашел до сих пор, включают объявления классов, поля и методы.(И универсальные классы AFAIK не поддерживают пользовательские атрибуты).

Некоторые примеры приведены в этой статье .Похоже, что переменные (внешние по отношению к любому объявлению класса) также могут иметь атрибуты.

Исходя из этой статьи, атрибуты можно использовать для

  • полей и методов класса и записи
  • параметры метода
  • свойства
  • объявления нелокальных перечислений
  • объявления нелокальных переменных

Существуют ли другие языковые элементы, где атрибутымогут быть размещены?


Обновление: в этой статье указывается, что настраиваемые атрибуты можно размещать перед свойствами: http://francois -piette.blogspot.de / 2013/01 / using-custom-attribute-for-data.html

Содержит этот пример кода:

type
  TConfig = class(TComponent)
  public
    [PersistAs('Config', 'Version', '1.0')]
    Version : String;
    [PersistAs('Config', 'Description', 'No description')]
    Description : String;
    FTest : Integer;
    // No attribute => not persistent
    Count : Integer;
    [PersistAs('Config', 'Test', '0')]
    property Test : Integer read FTest write FTest;
  end;

Я полагаю, что есть также способ чтения атрибутов в аргументах методов, таких как

procedure Request([FormParam] AUsername: string; [FormParam] APassword: string);

1 Ответ

25 голосов
/ 25 мая 2011

Интересный вопрос! Вы можете объявить атрибуты на почти на всех , проблема в том, чтобы получить их с помощью RTTI. Вот краткое демонстрационное руководство по объявлению пользовательских атрибутов для:

  • Перечисления
  • Тип функции
  • Тип процедуры
  • Тип метода (of object)
  • псевдоним типа
  • Тип записи
  • Тип класса
  • Тип записи, которая является внутренней для класса
  • Поле записи
  • Метод записи
  • Поле экземпляра класса
  • Поле класса class (class var)
  • Метод класса
  • Глобальная переменная
  • Глобальная функция
  • Локальная переменная

Не нашел способа объявить пользовательский атрибут для property класса. Но пользовательский атрибут может быть присоединен к методам получения или установки.

Код, история продолжается после кода:

program Project25;

{$APPTYPE CONSOLE}

uses
  Rtti;

type
  TestAttribute = class(TCustomAttribute);

  [TestAttribute] TEnum = (first, second, third);
  [TestAttribute] TFunc = function: Integer;
  [TestAttribute] TEvent = procedure of object;
  [TestAttribute] AliasInteger = Integer;

  [TestAttribute] ARecord = record
    x:Integer;
    [TestAttribute] RecordField: Integer;
    [TestAttribute] procedure DummyProc;
  end;

  [TestAttribute] AClass = class
  strict private
    type [TestAttribute] InnerType = record y:Integer; end;
  private
    [TestAttribute]
    function GetTest: Integer;
  public
    [TestAttribute] x: Integer;
    [TestAttribute] class var z: Integer;
    // Can't find a way to declare attribute for property!
    property Test:Integer read GetTest;
    [TestAttribute] class function ClassFuncTest:Integer;
  end;

var [TestAttribute] GlobalVar: Integer;

[TestAttribute]
procedure GlobalFunction;
var [TestAttribute] LocalVar: Integer;
begin
end;

{ ARecord }

procedure ARecord.DummyProc;
begin
end;

{ AClass }

class function AClass.ClassFuncTest: Integer;
begin
end;

function AClass.GetTest: Integer;
begin
end;

begin
end.

Проблема заключается в получении этих пользовательских атрибутов. Глядя на блок rtti.pas, можно получить пользовательские атрибуты для:

  • Тип записи (TRttiRecordType)
  • Тип экземпляра (TRttiInstanceType)
  • Тип метода (TRttiMethodType)
  • Тип указателя (TRttiPointerType) - для чего он используется?
  • Тип процедуры (TRttiProcedureType)

Нет способа получить какой-либо RTTI для уровня «единицы» или локальных переменных и процедур, следовательно, нет способа получить информацию об атрибутах.

...