2010-10-09 7 views
5

Actualmente estoy usando este código, pero no aparece nada. ¿Qué me estoy perdiendo?¿Cómo puedo enumerar los atributos de una propiedad usando el 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. 

Respuesta

5

Eche un vistazo a las advertencias de su compilador. Cuando construyo esto, veo:

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

Esto se debe a un capricho histórico. Los atributos compatibles con el compilador .NET de Delphi se utilizan ampliamente en el VCL para varias cosas .NET. El compilador de Delphi para Win32 tenía que poder leerlos e ignorarlos.

Luego salió Delphi 2010, y Delphi Win32 admitió atributos de repente. Pero todos estos atributos .NET no existían en Delphi. En lugar de alejarlos a todos, hicieron que el compilador simplemente diera una advertencia y luego los ignorara. (Además, creo que escuché a alguien de Emb. Decir que Delphi para .NET todavía se usa internamente por cualquier razón.)

Como efecto secundario, es perfectamente válido poner un atributo que no existe en realidad. tus clases. Simplemente será ignorado por el compilador y no se generará RTTI para él.

+0

Muchas gracias Mason. – Salvador

+2

Para agregar a esto, si desea usar atributos personalizados en su código y hacerlos accesibles para RTTI, entonces necesita explícitamente definir clases de atributos en su código. Hay un capítulo completo en la documentación de 2010 sobre este tema: ms-help: //embarcadero.rs2010/rad/Attributes_Index.html –

Cuestiones relacionadas