我想将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;

最佳答案

如果您确实需要匿名方法,请创建一个匿名方法:

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;

07-27 14:53