And*_*and 25 delphi procedure compile-time
是否可以在过程/函数中获取当前过程/函数的名称作为字符串?我想在编译时会有一些"宏"扩展.
我的情况是这样的:我有很多程序被给予记录,他们都需要从检查记录的有效性开始,因此他们将记录传递给"验证程序".如果记录无效,验证程序(所有程序都是同一个程序)会引发异常,并且我希望异常的消息不包括验证程序的名称,而是包含调用验证程序的函数/过程的名称程序(自然地).
就是,我有
procedure ValidateStruct(const Struct: TMyStruct; const Sender: string);
begin
if <StructIsInvalid> then
raise Exception.Create(Sender + ': Structure is invalid.');
end;
Run Code Online (Sandbox Code Playgroud)
然后
procedure SomeProc1(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SomeProc1');
...
end;
...
procedure SomeProcN(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SomeProcN');
...
end;
Run Code Online (Sandbox Code Playgroud)
如果我可以写出类似的内容,那么它会更容易出错
procedure SomeProc1(const Struct: TMyStruct);
begin
ValidateStruct(Struct, {$PROCNAME});
...
end;
...
procedure SomeProcN(const Struct: TMyStruct);
begin
ValidateStruct(Struct, {$PROCNAME});
...
end;
Run Code Online (Sandbox Code Playgroud)
然后每次编译器遇到{$ PROCNAME}时,它只是将当前函数/过程的名称替换为"宏"作为字符串文字.
更新
第一种方法的问题在于它容易出错.例如,由于复制粘贴,你很容易弄错:
procedure SomeProc3(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SomeProc1');
...
end;
Run Code Online (Sandbox Code Playgroud)
或错别字:
procedure SomeProc3(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SoemProc3');
...
end;
Run Code Online (Sandbox Code Playgroud)
或者只是暂时的混淆:
procedure SomeProc3(const Struct: TMyStruct);
begin
ValidateStruct(Struct, 'SameProc3');
...
end;
Run Code Online (Sandbox Code Playgroud)
Fra*_*ois 10
我们正在做类似的事情,只依赖于一个约定:在一开始就把SMethodName
一个const 包含函数名.
然后我们所有的例程都遵循相同的模板,我们在Assert和其他异常引发中使用这个const.
由于const与常规名称的接近程度,很少有机会将拼写错误或任何差异留在那里很长时间.
YMMV当然......
procedure SomeProc1(const Struct: TMyStruct);
const
SMethodName = 'SomeProc1';
begin
ValidateStruct(Struct, SMethodName);
...
end;
...
procedure SomeProcN(const Struct: TMyStruct);
const
SMethodName = 'SomeProcN';
begin
ValidateStruct(Struct, SMethodName);
...
end;
Run Code Online (Sandbox Code Playgroud)
我认为这是这个问题的重复:如何在Delphi 7中获取当前方法的名称?
答案是,为此,您需要在项目中使用某种形式的调试信息,并使用例如JCL函数从中提取信息.
我要补充一点,我没有在D2009/2010中使用过新的RTTI支持,但如果你能用它做一些聪明的话,我也不会感到惊讶.例如,这将向您展示如何列出类的所有方法,并且每个方法都由TRttiMethod表示.它来自TRttiNamedObject,它具有Name属性,该属性"指定反射实体的名称".我确信必须有一种方法来获取你当前所处的位置,即你当前所处的方法.这都是猜测,但试着去试试吧!
归档时间: |
|
查看次数: |
18132 次 |
最近记录: |