如何在没有硬编码的情况下获取methodname?

时间:2015-05-19 18:34:11

标签: delphi

program Project37;

{$APPTYPE CONSOLE}

{$RTTI EXPLICIT METHODS([vcPrivate,vcProtected,vcPublic, vcPublished])}

   type
      TBar = class
        procedure Test1; virtual;
      end;

      TFoo = class(TBar)
      end;


      procedure TBar.Test1;
      begin
        WriteLn(MethodName(@TBar.Test1)); //compiles, but does not show anything
        //WriteLn(MethodName(@Self.Test1)); //does not compile
      end;

var
  Foo: TBar;

begin
  Foo:= TFoo.Create;
  Foo.Test1;
  Foo.Free
  Foo:= TBar.Create;
  Foo.Test1;
  Foo.Free;
  ReadLn;
end.

如果我运行程序没有显示任何内容 如何让MethodName实际工作?

我使用XE7,但我怀疑它在旧版本中有所不同。

1 个答案:

答案 0 :(得分:6)

MethodName要求发布该方法。满足这样的要求:

type
  TBar = class
  published
    procedure Test1; virtual;
  end;

如果要获取未发布的成员的方法名称,请使用新样式RTTI。像这样:

{$APPTYPE CONSOLE}
{$RTTI EXPLICIT METHODS([vcPrivate,vcProtected,vcPublic, vcPublished])}

uses
  System.Rtti;

type
  TBar = class
  private
    procedure Test1;
  end;

procedure TBar.Test1;
begin
end;

var
  ctx: TRttiContext;
  Method: TRttiMethod;

begin
  for Method in ctx.GetType(TBar).GetMethods do
    if Method.CodeAddress=@TBar.Test1 then
      Writeln(Method.Name);
end.

当然,您可以将其包装到一个函数中,该函数将返回给定类型和代码地址的方法名称。