Как я могу перечислить атрибуты свойства, используя RTT? - PullRequest
5 голосов
/ 10 октября 2010

Я сейчас использую этот код, но ничего не перечисляю.Чего мне не хватает?

program ListAttrs;

{$APPTYPE CONSOLE}

uses
  Rtti,
  SysUtils;

type
  TPerson = class
  private
    FName: String;
    FAge: Integer;
  public
    [NonEmptyString('Must provide a Name')]
    property Name : String read FName write FName;
    [MinimumInteger(18, 'Must be at least 18 years old')]
    [MaximumInteger(65, 'Must be no older than 65 years')]
    property Age : Integer read FAge write FAge;
  end;


procedure test;
var
  ctx       : TRttiContext;
  lType     : TRttiType;
  lAttribute: TCustomAttribute;
  lProperty : TRttiProperty;
begin
   ctx       := TRttiContext.Create;
   lType     := ctx.GetType(TPerson);
   for lProperty in lType.GetProperties do
    for lAttribute in lProperty.GetAttributes do
    Writeln(lAttribute.ToString);
end;

begin
  try
     Test;
     Readln;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
end.

1 Ответ

5 голосов
/ 10 октября 2010

Посмотрите на предупреждения вашего компилятора.Когда я строю это, я вижу:

[DCC Warning] ListAttrs.dpr(15): W1025 Unsupported language feature: 'custom attribute'
[DCC Warning] ListAttrs.dpr(17): W1025 Unsupported language feature: 'custom attribute'
[DCC Warning] ListAttrs.dpr(18): W1025 Unsupported language feature: 'custom attribute'

Это связано с исторической причудой.Атрибуты, поддерживаемые компилятором Delphi для .NET, и они широко используются в VCL для различных вещей .NET.Компилятор Delphi для Win32 должен был иметь возможность их читать и игнорировать.

Затем вышел Delphi 2010, и Delphi Win32 неожиданно поддержал атрибуты.Но все эти атрибуты .NET не существовали в Delphi.Вместо того, чтобы искоренить их все, они заставили компилятор просто выдать предупреждение, а затем проигнорировать их.(Кроме того, мне кажется, я слышал, как кто-то из Emb. Сказал, что Delphi для .NET по-прежнему используется внутри компании по любой причине.)

В качестве побочного эффекта вполне допустимо использовать атрибут, который на самом делесуществуют в ваших классах.Он будет просто проигнорирован компилятором, и RTTI для него не будет сгенерирован.

...