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,但我怀疑它在旧版本中有所不同。
答案 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.
当然,您可以将其包装到一个函数中,该函数将返回给定类型和代码地址的方法名称。