2014-04-09 18 views
13

Ist dieser gültige Code mit neueren Delphi-Versionen?Ist es möglich, Attribute für Delphi-Methodenargumente zu verwenden?

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

In diesem Beispiel wird das Argument "ProductID" mit [QueryParam] zugeschrieben. Wenn dies in Delphi gültiger Code ist, muss es auch eine Möglichkeit geben, RTTI-basierten Code zu schreiben, um die attributierte Argumenttypinformation zu finden.

Siehe meine vorherige Frage Which language elements can be annotated using attributes language feature of Delphi?, die einige Sprachelemente auflistet, die über die Arbeit mit Attributen berichtet haben. Attribute für Argumente fehlten in dieser Liste.

+3

Leider ist die [Dokumentation] (http://docwiki.embarcadero.com/RADStudio/en/Annotating_Types_and_Type_Members) ist falsch. Es sagt: * Die folgenden Codebausteine ​​veranschaulichen die verschiedenen Sprachkonstrukte, die Annotationen erlauben. * Nachdem eine komplette Enumeration der Sprachkonstrukte angekündigt wurde, gibt es eine unvollständige Liste. –

Antwort

21

Ja, Sie können:

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 - Diese Attribute sind mächtig, aber nicht gut dokumentiert :( –

Verwandte Themen