2014-04-09 29 views
13

Bu geçerli kod daha yeni Delphi sürümleriyle mi? Bu örnekte Delphi yöntemi argümanlarında Attributes kullanmak mümkün mü?

// handle HTTP request "example.com/products?ProductID=123" 
procedure TMyRESTfulService.HandleRequest([QueryParam] ProductID: string); 

, argüman olarak "ÜrünNo" [QueryParam] ile ilişkilendirilir. Bu, Delphi'de geçerli bir kodsa, atıfta bulunulan argüman türü bilgisini bulmak için RTTI tabanlı kod yazmanın bir yolu olmalıdır.

Özniteliklerle çalıştığını bildiren bazı dil öğelerini listeleyen önceki soruma bakın Which language elements can be annotated using attributes language feature of Delphi?. Bu listedeki argümanlardaki öznitelikleri eksik.

+3

Maalesef [dokümantasyon] (http://docwiki.embarcadero.com/RADStudio/en/Annotating_Types_and_Type_Members) yanlıştır. Şöyle der: * Aşağıdaki kod blokları, ek açıklamalara izin veren farklı dil yapılarını örneklendirir. * Dil yapılarının tam sayımını açıkladıktan sonra, tamamlanmamış bir liste verir. –

cevap

21

Evet yapabilirsiniz:

program Project1; 

{$APPTYPE CONSOLE} 

uses 
    Rtti, 
    SysUtils; 

type 
    QueryParamAttribute = class(TCustomAttribute) 
    end; 

    TMyRESTfulService = class 
    procedure HandleRequest([QueryParam] ProductID: string); 
    end; 

procedure TMyRESTfulService.HandleRequest(ProductID: string); 
begin 

end; 

var 
    ctx: TRttiContext; 
    t: TRttiType; 
    m: TRttiMethod; 
    p: TRttiParameter; 
    a: TCustomAttribute; 
begin 
    try 
    t := ctx.GetType(TMyRESTfulService); 
    m := t.GetMethod('HandleRequest'); 
    for p in m.GetParameters do 
     for a in p.GetAttributes do 
     Writeln('Attribute "', a.ClassName, '" found on parameter "', p.Name, '"'); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
    Readln; 
end. 
+3

+1 - Bu özellikler güçlü ancak iyi belgelenmemiş :( –

İlgili konular