5

我目前正在使用此代码,但没有列出任何内容。我错过了什么?

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.
4

1 回答 1

5

看看你的编译器警告。当我构建它时,我看到:

[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 for .NET 编译器支持属性,它们在 VCL 中广泛用于各种 .NET 事物。Delphi for Win32 编译器必须能够读取它们并忽略它们。

然后Delphi 2010出来了,Delphi Win32突然支持属性了。但是所有这些 .NET 属性在 Delphi 中都不存在。他们没有将它们全部根除,而是让编译器只发出警告然后忽略它们。(另外,我相信我从 Emb. 那里听到有人说 Delphi for .NET 出于任何原因仍在内部使用。)

作为副作用,在您的类中放置一个实际上不存在的属性是完全有效的。它只会被编译器忽略,并且不会生成它的 RTTI。

于 2010-10-10T03:53:20.237 回答