Delphi:获取调用者函数的UnitName

Mic*_*ter 5 delphi

unit MyFirstUnit;\n  uses MyTranslateUnit;\n  ...\n  sText := Dictionary('text to translate', UnitName);\n  ...\nend.\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xc2\xa0

\n\n
unit AnotherUnit;\n  uses MyTranslateUnit;\n  ...\n  sText := Dictionary('new text to translate', UnitName);\n  ...\nend.\n
Run Code Online (Sandbox Code Playgroud)\n\n

\xc2\xa0

\n\n
unit MyTranslateUnit;\n  function Dictionary(sTextToTranslate: string; sUnitName: string)\n  begin\n    // Here I need the UnitName of the caller\n    Result := ...\n  end;\nend.\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的程序中有很多地方调用Dictionary(...)。如何避免将 UnitName 作为第二个参数传递?
\n是否可以在没有第二个参数的情况下在 MyTranslateUnit 中获取调用者的 UnitName?

\n\n

我想要一个像

\n\n
\n

函数字典(sTextToTranslate:字符串)

\n
\n

Uwe*_*abe 6

只要调用发生在类的方法内部,您就可以简单地编写UnitName. 每个 Delphi 都TObject提供了 ,class function UnitName: string;它给出了声明类的单元的名称。

这不会让您省略第二个参数,但它可以简化单元重命名或代码在单元之间复制或移动时的维护。

编辑:有一个真正肮脏的黑客可以在没有第二个参数的情况下使这项工作正常工作,并且它也只能在类的方法中工作。我建议仅将其作为最后的手段!删除一个参数的好处很容易在将来适得其反。

为 TObject声明一个类帮助器,如下所示:

type
  TRealDirtyDontDoItObjectHelper = class helper for TObject
  public
    class function Dictionary(const sTextToTranslate: string): string;
  end;

implementation

class function TRealDirtyDontDoItObjectHelper.Dictionary(const sTextToTranslate: string): string;
begin
  { whatever implementation should go here }
  Result := UnitName + ': ' + sTextToTranslate;
end;
Run Code Online (Sandbox Code Playgroud)

现在你可以调用类似的东西

Caption := Dictionary('title');
Run Code Online (Sandbox Code Playgroud)

在任何方法内部,whereUnitName给出声明该方法所属类的单元。请注意,这意味着当前实例的类,而不一定是声明该方法的某个继承类。

我还应该提到,TObject 的这个类帮助器不会干扰任何其他类的类帮助器,即使这些显然继承自TObject.