Ответ 1
Интересный вопрос! Вы можете объявлять атрибуты на почти ничего, проблема заключается в получении их с помощью RTTI. Здесь приведена демонстрация быстрой консоли объявления пользовательских атрибутов для:
- Перечисления
- Тип функции
- Тип процедуры
- Тип метода (
of object
) - Тип с псевдонимом
- Тип записи
- Тип класса
- Тип записи, который является внутренним для класса
- Поле записи
- Способ записи
- Поле экземпляра класса
- Поле класса
class
(class var
) - Метод класса
- Глобальная переменная
- Глобальная функция
- Локальная переменная
Не нашел способ объявить пользовательский атрибут для property
класса. Но настраиваемый атрибут может быть привязан к методам getter или setter.
Код, история продолжается после кода:
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 для уровня "unit" или локальных переменных и процедур, следовательно, нет способа получить информацию об атрибутах.