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 に答える