2010-10-09 31 views
5

Je suis actuellement en train d'utiliser ce code, mais ne mentionne rien. Qu'est-ce qui me manque?Comment puis-je lister les attributs d'une propriété en utilisant le 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. 

Répondre

5

Jetez un oeil à vos avertissements du compilateur. Quand je construis ceci, je vois:

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

Ceci est dû à une anomalie historique. Le Delphi pour les attributs pris en charge par le compilateur .NET, et ils sont largement utilisés dans la VCL pour diverses choses .NET. Le compilateur Delphi for Win32 devait être capable de les lire et de les ignorer. Puis Delphi 2010 est sorti, et Delphi Win32 pris en charge les attributs soudainement. Mais tous ces attributs .NET n'existaient pas dans Delphi. Au lieu de les éliminer tous, ils ont demandé au compilateur de donner un avertissement, puis de les ignorer. (De plus, je crois avoir entendu quelqu'un d'Emb. Dire que Delphi pour .NET est encore utilisé en interne pour une raison quelconque.)

Comme effet secondaire, il est parfaitement possible de mettre un attribut qui n'existe pas réellement Vos classes. Il sera simplement ignoré par le compilateur et aucune RTTI ne sera générée.

+0

Merci beaucoup Mason. – Salvador

+2

Pour ajouter à cela, si vous voulez utiliser des attributs personnalisés dans votre code et les rendre accessibles à RTTI, vous devez définir explicitement des classes d'attributs dans votre code. Il y a un chapitre entier dans la documentation de 2010 sur ce sujet: ms-help: //embarcadero.rs2010/rad/Attributes_Index.html –