Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 RTTI атрибуты у Generic класса  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10578
Объявляю кастомный атрибут
TMyAttr = class(TCustomAttribute);

Описываю свойство этим атрибутом
TMyClass = class
strict private
  FID: Integer;
public
  [TMyAttr]
  property ID: Integer read FID write FID;
end;
пытаюсь его прочитать
procedure TestAttr(AObj: TObject);
var
  LCtx: TRttiContext;
  LType: TRttiType;
  LProps: TArray<TRttiProperty>;
  LAttrs: TArray<TCustomAttribute>;
begin
  LCtx := TRttiContext.Create;
  try
    Writeln(AObj.ClassName);
    LType := LCtx.GetType(AObj.ClassInfo);
    LProps := LType.GetProperties;
    Writeln('Props count: ', Length(LProps));
    LAttrs := LProps[0].GetAttributes;
    Writeln('Attrs count: ', Length(LAttrs));
  finally
    LCtx.Free;
  end;
end;

TestAttr(TMyClass.Create);
получаю
TMyClass
Props count: 1
Attrs count: 1
Все работает.

Дальше, помечаю этим же атрибутом свойство generic-класса
TMyClass2<T> = class
strict private
  FID: Integer;
public
  [TMyAttr]
  property ID: Integer read FID write FID;
end;
читаю
TestAttr(TMyClass2<TObject>.Create);
получаю 0 атрибутов
TMyClass2<System.TObject>
Props count: 1
Attrs count: 0

Вопрос, что я делаю не так и что нужно добавить, чтобы у generic-класса тоже читались атрибуты?

Delphi XE3

С уважением, Vasilisk
16 май 18, 16:55    [21414309]     Ответить | Цитировать Сообщить модератору
 Re: RTTI атрибуты у Generic класса  [new]
X-Cite
Member

Откуда: Минск
Сообщений: 1136
В Delphi XE6
+
program Project2;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  System.Rtti;

type
  TMyAttr = class(TCustomAttribute);

  TMyClass2<T> = class
  strict private
    FID: Integer;
  public
    [TMyAttr]
    property ID: Integer read FID write FID;
  end;

procedure TestAttr(AObj: TObject);
var
  LCtx: TRttiContext;
  LType: TRttiType;
  LProps: TArray<TRttiProperty>;
  LAttrs: TArray<TCustomAttribute>;
begin
  LCtx := TRttiContext.Create;
  try
    Writeln(AObj.ClassName);
    LType := LCtx.GetType(AObj.ClassInfo);
    LProps := LType.GetProperties;
    Writeln('Props count: ', Length(LProps));
    LAttrs := LProps[0].GetAttributes;
    Writeln('Attrs count: ', Length(LAttrs));
  finally
    LCtx.Free;
  end;
end;

begin
  TestAttr(TMyClass2<TObject>.Create);
  readln;
end.

TMyClass2<System.TObject>
Props count: 1
Attrs count: 1
16 май 18, 19:27    [21414750]     Ответить | Цитировать Сообщить модератору
 Re: RTTI атрибуты у Generic класса  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10578
X-Cite
В Delphi XE6
Блин! Что-то подобное чувствовал
16 май 18, 19:34    [21414762]     Ответить | Цитировать Сообщить модератору
 Re: RTTI атрибуты у Generic класса  [new]
makhaon
Member

Откуда: A galaxy far far away
Сообщений: 2843
_Vasilisk_,

Посвежее сильно получше стали, есть такое. Сам на XE6 сижу. Видимо - минимально из XE-шек нормально юзабельная. Хотя, конечно, зависит что делать.
16 май 18, 20:40    [21414847]     Ответить | Цитировать Сообщить модератору
 Re: RTTI атрибуты у Generic класса  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10578
makhaon,

Мы купили Токио. Я даже поставил его. Но все нет времени переползти. Может это меня вдохновит :)
16 май 18, 21:37    [21414903]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить