2010-10-09 12 views
5

Attualmente sto usando questo codice, ma non elenca nulla. Cosa mi manca?Come posso elencare gli attributi di una proprietà usando rtti?

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. 

risposta

5

Dai un'occhiata agli avvisi del compilatore. Quando costruisco questo, vedo:

[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' 

Ciò è dovuto a un capriccio storico. Il compilatore di Delphi per .NET ha supportato gli attributi e sono ampiamente utilizzati nel VCL per varie cose .NET. Il compilatore Delphi per Win32 doveva essere in grado di leggerli e ignorarli.

Quindi Delphi 2010 è uscito e Delphi Win32 ha supportato gli attributi all'improvviso. Ma tutti questi attributi .NET non esistevano in Delphi. Invece di radicarli tutti, hanno fatto in modo che il compilatore desse un avvertimento e li ignorasse. (Inoltre, credo di aver sentito qualcuno da Emb. Dì che Delphi per .NET è ancora usato internamente per qualsiasi motivo.)

Come effetto collaterale, è perfettamente valido inserire un attributo che in realtà non esiste le tue lezioni Sarà semplicemente ignorato dal compilatore e non verrà generato RTTI.

+0

Grazie mille Mason. – Salvador

+2

Per aggiungere a questo, se si desidera utilizzare attributi personalizzati nel codice e averli accessibili a RTTI, è necessario definire in modo esplicito le classi di attributi nel codice. C'è un intero capitolo nella documentazione del 2010 su questo argomento: ms-help: //embarcadero.rs2010/rad/Attributes_Index.html –