2012-06-04 3 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' и' return type' совместимы. –

Смежные вопросы