2014-04-09 71 views
13

這個有效的代碼包含更新的Delphi版本嗎?是否可以在Delphi方法參數上使用Attributes?

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

在此示例中,變量 「產品ID」 是由於與[QueryParam]。如果這是Delphi中的有效代碼,那麼還必須有一種方法來編寫基於RTTI的代碼來查找屬性參數類型信息。

查看我之前的問題Which language elements can be annotated using attributes language feature of Delphi?,其中列出了一些已報告可以使用屬性的語言元素。參數上的屬性在這個列表中缺失。

+3

不幸的是,[文件](http://docwiki.embarcadero.com/RADStudio/en/Annotating_Types_and_Type_Members)是錯誤的。它說:*以下代碼塊舉例說明了允許註釋的不同語言結構。*在宣佈了語言結構的完整枚舉後,它會給出一個不完整的列表。 –

回答

21

是,您可以:

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這些屬性功能強大但沒有很好的記錄:( –

相關問題