delphi - 如何从 TRttiMethod 获取/创建匿名方法?

标签 delphi delphi-xe rtti

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

关于delphi - 如何从 TRttiMethod 获取/创建匿名方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10879916/

相关文章:

delphi - 删除用纯汇编编写的函数的序言

delphi - Delphi Rio 帮助中包含最脏的示例代码。我是否遗漏了一些明显的东西?

Delphi XE 显示至少 200 个错误,但程序编译得很好

delphi - 如何正确使用 TValue.AsType<TNotifyEvent>?

delphi - 如何检查后代类是否覆盖所有虚拟方法?

html - 解析 Google SERP 结果的 Delphi 建议

c++ - 在以 Windows 为目标的 Delphi 应用程序中是否对对象引用计数?如果是,它的目的是什么?

delphi - Control + Click功能在Delphi XE中不起作用

delphi - 处理异常

c++ - 在 OO 设计中避免 RTTI