3

我想处理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;
4

1 回答 1

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;
于 2012-06-04T11:08:02.517 回答