2009-09-14 102 views
4

基本上我有一个Web服务,我试图把某种使用日志记录。 要做到这一点,我创建了一个记录方法的类。 我在服务上创建类,然后在每个Web方法中调用日志记录方法。获取调用方法的名称

我试图找到让已调用loggong方法

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”

回答

10

您需要使用适当的构造函数实例化StackFrame。例如,

Dim stackframe As New Diagnostics.StackFrame(1) 

将跳过一个堆栈帧(日志记录方法本身)并获取该方法调用者的帧。这说 - 如果可能的话,我强烈建议使用标准日志机制,如log4net

+2

+1用于log4net。 – Rap

0

你应该可以从StackFrame中获得这个信息,构造函数告诉它有多少帧要上链,所以让父节点使用1(该帧是基于零的,所以0是当前方法):

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

我使用这个代码利用获取调用方法

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

记得加namespac诊断

-2

不要尝试使用StackFrame。它只能在调试模式下工作,这对于应用程序速度是一个杀手。

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

+0

有没有必要downvote我 - 我只是指出如何使StackFrame为提问者工作,但我特别推荐使用log4net(其工作在发布模式以及调试模式)。 你应该只能低估无益的答案 - 根据我的估算,我的回答并非无益。 –

+0

顺便说一句,我不是那个让你失望的人。如果没有留下评论给出downvote的理由,我绝不会冷静下来。 –

+1

顺便说一句,原因是我的帖子。我低估了所有StackFrame的帖子,因为这是一个月的工作,找出为什么应用程序不能在发布模式下工作。 – Migol

8

我认为上面的语句可以被制成一个单一的线:

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

这将显示一个消息框与调用方法名称。

4

VB.Net

System.Reflection.MethodBase.GetCurrentMethod.Name() 
+1

这不会得到当前方法的名称吗?我认为OP在询问如何获取调用当前方法的方法的名称。 – Kevin

0

我添加了调用形式为所有子例程和功能 像calledfunction(我PARA1,PARA2 ......),这样我可以识别的第一个参数呼叫形式并在被调用例程中使用其名称或文本