2012-06-04 59 views
3

我想處理一個TRttiMethod作爲匿名方法。我怎麼能這樣做?如何從TRttiMethod獲取/創建匿名方法?

這裏是我多麼希望的事情一個簡單的例子來工作:

接口:

TMyClass = class 
public 
    // this method will be acquired via Rtti 
    procedure Foo; 

    // this method shall return above Foo as anonymous method 
    function GetMethodAsAnonymous: TProc; 
end; 

實現:

function TMyClass.GetMethodAsAnonymous: TProc; 
var 
    Ctx: TRttiContext; 
    RttiType: TRttiType; 
    RttiMethod: TRttiMethod; 
begin 
    Ctx := TRttiContext.Create; 
    try 
    RttiType := Ctx.GetType(Self.ClassType); 
    RttiMethod := RttiType.GetMethod('Foo'); 

    Result := ??????; // <-- I want to put RttiMethod here - but how? 
    finally 
    Ctx.Free; 
    end; 
end; 

回答

2

如果你真的想匿名方法,然後進行了匿名方式:

Result := procedure 
      begin 
      RttiMethod.Invoke(Self, []); 
      end; 

你也可以構造一個簡單的方法指針:

var 
    Method: procedure of object; 

TMethod(Method).Code := RttiMethod.CodeAddress; 
TMethod(Method).Data := Self; 
Result := Method; 

當然,最直接的方法不使用RTTI都:

Result := Foo; 
+0

謝謝,前兩個解決方案,爲我的工作情況。我認爲唯一的警告:他們都明確重複返回類型的簽名。我希望有一個解決方案,我不需要這樣做。推斷出「RttiMethod」和「返回類型」的簽名是兼容的。 –