【问题标题】:Current class method name as string当前类方法名称为字符串
【发布时间】:2014-01-15 22:42:43
【问题描述】:

我想知道 Object Pascal 是否有办法获取当前正在执行的方法的名称。

procedure SomeClass.SomeMethod(SomeArgs...);
begin
    { This should print 'This method name is: SomeMethod' }
    WriteLn('This method name is: ' + ???);
end;

看起来 TObject 的内容与我在描述中需要的内容相似,但我无法使其工作。

 public class function TObject.MethodName(address: pointer): shortstring;

这是我应该走的路吗?
如果我尝试MethodName(self),它总是返回一个空字符串。
如何获取类中方法的指针?

【问题讨论】:

    标签: function delphi class methods pascal


    【解决方案1】:

    我不知道经典的 Object Pascal(Apple 的),但 Delphi/FPC:

    在 D2010 之前:如果方法已发布,则只有 RTTI,在其他情况下,程序名称会被优化掉。 Unit typinfo 是你的朋友,iirc typeinfo 可以通过使用 typeinfo(@TSomeclass.Somemethod) 获得。

    D2010:有生成更多 RTTI 信息的选项。 参见例如RTTI information for method pointer

    Free Pascal:2.6.x 及以下,与 D2010 之前一样,2.7.x 与 D2010 一样,但仍在开发中。

    【讨论】:

    • 我很高兴听到这是可能的,但这需要太多的工作,在这种情况下对我来说更值得。我想我只会在每个方法中声明一个常量字符串,没什么大不了的。我虽然这可以更容易地完成。
    • Afaik 这是一个请求的功能。 Free Pascal 对此有一些方法(插入例如文件名和行号),但还没有过程/方法名。
    • 但是,我仍在寻找与 RTTI / 手动名称传递不同的方式。也许有人知道这种方法?
    • 理论上,可能有一些方法可以访问详细的调试信息并在运行时查找地址,然后将其缓存。但这非常依赖于编译器和版本。使用 debuginfo 分发应用程序也不流行。
    • 好吧。我现在正在尝试使用与 delphi 类似的方式使用 RTTI,但它仅适用于已发布的方法,我想知道我错过了什么或我做错了什么。 GetPropList 是我的方式。有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 2015-04-08
    • 2016-03-13
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多