2010-10-09 8 views
5

Obecnie używam tego kodu, ale niczego nie wymieniam. Czego mi brakuje?Jak mogę wyświetlić atrybuty właściwości za pomocą 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. 

Odpowiedz

5

Zobacz ostrzeżenia kompilatora. Kiedy ją buduję, widzę:

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

Wynika to z historycznego dziwactwa. Obsługiwane atrybuty Delphi dla .NET kompilatora i są powszechnie używane w VCL dla różnych rzeczy .NET. Kompilator Delphi for Win32 musiał być w stanie je odczytać i zignorować.

Następnie Delphi 2010 wyszedł, a Delphi Win32 obsługiwał atrybuty nagle. Ale wszystkie te atrybuty .NET nie istniały w Delphi. Zamiast wykorzenić je wszystkie, kompilator po prostu dał ostrzeżenie, a następnie je zignorował. (Sądzę też, że słyszałem, że ktoś z Emb. Mówi, że Delphi dla .NET jest nadal używany wewnętrznie z jakiegokolwiek powodu.)

Jako efekt uboczny, jest całkowicie poprawne umieszczenie atrybutu, który w rzeczywistości nie istnieje Twoje zajęcia. Zostanie on po prostu zignorowany przez kompilator i nie zostanie wygenerowany żaden protokół RTTI.

+0

Bardzo dziękuję Mason. – Salvador

+2

Aby dodać do tego, jeśli chcesz używać atrybutów niestandardowych w kodzie i mieć je dostępne dla RTTI, musisz jawnie zdefiniować klasy atrybutów w swoim kodzie. W dokumentacji 2010 na ten temat znajduje się cały rozdział: ms-help: //embarcadero.rs2010/rad/Attributes_Index.html –

Powiązane problemy