获取调用方法的名称

6

基本上,我有一个Web服务,正在尝试添加某种使用日志记录。为此,我创建了一个带有日志记录方法的类。我在服务上实例化该类,然后在每个Web方法中调用日志记录方法。

我正在尝试找到一种方法来获取调用日志记录方法的方法名称。

Public sub tstmethod
log_object.log_method
end sub

在这种情况下,我要找到的返回名称是“tstmethod”。
我看到的所有地方都说要使用:
Dim stackframe As New Diagnostics.StackFrame
Return stackframe.GetMethod.Name.ToString

或者使用

Dim stackframe As New Diagnostics.StackFrame
Return stackframe.GetMethod.DeclaringType.FullName

我在日志记录方法内部调用的方法我称之为“内部调用方法”

getmethod.name.tostring返回日志记录方法的名称

getmethod.declaringtype.fullname返回日志记录类的名称

无论我做什么,我都找不到一种获取调用日志记录方法的方法名称的方法,在这种情况下是“tstmethod”

7个回答

13

你需要使用适当的构造函数来实例化StackFrame对象。例如,

Dim stackframe As New Diagnostics.StackFrame(1)

会跳过一个堆栈帧(即记录方法本身),并获取调用该方法的调用者的帧。

话虽如此,如果可能的话,我强烈建议使用标准的日志记录机制,例如log4net


在生产环境中无法工作。 - Inc33

12

我认为上述语句可以合并成一行:

MsgBox((New System.Diagnostics.StackTrace).GetFrame(1).GetMethod.Name)

这将显示一个消息框,就像调用方法名一样。


4

VB.Net

System.Reflection.MethodBase.GetCurrentMethod.Name()

3
这只会获取当前方法的名称,我认为提问者想知道如何获取调用当前方法的方法名称。 - Kevin

0
我将调用表单添加为所有子例程和函数的第一个参数,例如calledfunction(me, para1, para2......),这样我就可以识别调用表单并在被调用例程中使用其名称或文本。

0

不要尝试使用StackFrame。它只能在调试模式下工作,这会对应用程序的速度造成影响。

在发布模式下无法获取此信息,您应该考虑更改设计并添加参数。


没有必要给我点踩 - 我只是指出如何让 StackFrame 对提问者起作用,但我特别推荐使用 log4net(它在 Release 模式和 Debug 模式下都可以工作)。你应该只会给无用的答案点踩 - 按我的估计,我的回答并不是无用的。 - Vinay Sajip
顺便说一句,我不是那个给你点踩的人。我从不会在没有留下评论说明点踩原因的情况下点踩。 - Vinay Sajip
2
顺便说一下,原因是我的帖子。我对所有 StackFrame 的帖子进行了负面评价,因为这花费了一个月的时间才找出应用程序在发布模式下为什么无法工作。 - Migol
-1:如果您修改项目属性以包括pdb,则它可以在发布模式下工作。 - Gabriel McAdams
我在项目属性中找不到这个特定的设置。MSDN上也没有相关信息。也许你混淆了C++的知识? - Migol
StackFrame始终包含堆栈 - 即使在没有pdb的发布版本中 - pdb仅需要获取源文件名和行号。 - NiKiZe

0

你应该可以从 StackFrame 中获取这个,通过构造函数告诉它需要向上跳多少层,所以获取父级会使用 1(帧是从零开始的,因此 0 是当前方法):

Dim stackTrace as New Diagnostics.StackFrame(1)
Return stackTrace.GetMethod.Name

-1

我正在使用以下代码获取调用方法

string methodName = new StackFrame( 1, true ).GetMethod().Name;
methodName = " [" + methodName + "]";
return methodName;

记得添加命名空间Diagnostics


在这种情况下,将fNeedFileInfo设置为trueStackFrame构造函数的第二个参数)有点多余,不是吗? - NiKiZe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接