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が登場し、DelphiWin32が突然属性をサポートしました。しかし、これらすべての.NET属性はDelphiには存在しませんでした。それらをすべて根絶する代わりに、彼らはコンパイラに警告を出させてからそれらを無視させました。(また、Emb。の誰かが、Delphi for .NETは、何らかの理由でまだ内部で使用されていると言っているのを聞いたと思います。)

副作用として、実際にはクラスに存在しない属性を設定することは完全に有効です。コンパイラによって無視されるだけで、RTTIは生成されません。

于 2010-10-10T03:53:20.237 に答える