Reputation: 665
Basically i've got a web service that i'm trying to put some kind of usage logging in. To do this i've created a class with a logging method. I instatiate the class on the service and then call the logging method in each of the web methods.
I'm trying to find a way of getting the name of the method that has called the loggong method
Public sub tstmethod
log_object.log_method
end sub
in this case the returned name i'm looking for is "tstmethod"
Everywhere i've seen has said to either use
Dim stackframe As New Diagnostics.StackFrame
Return stackframe.GetMethod.Name.ToString
Or to use
Dim stackframe As New Diagnostics.StackFrame
Return stackframe.GetMethod.DeclaringType.FullName
which i call inside the logging method
getmethod.name.tostring returns the name of the logging method
getmethod.declaringtype.fullname returns the name of the logging class
no matter what i do i cannot find a way of getting the name of the method that called the logging method in this case "tstmethod"
Upvotes: 6
Views: 26980
Reputation: 3666
You could do this:
Imports System.Runtime.CompilerServices
Private Sub LogError(message As String, <CallerMemberName> Optional caller As String = null)
'Logging logic here using caller
End Sub
Upvotes: 1
Reputation: 1
I add the calling form as the first parameter for all sub routines and functions like calledfunction(me,para1,para2......) so that i can identify the calling form and use its name or text in the called routine
Upvotes: 0
Reputation: 563
I think the above statement can be made into one single line:
MsgBox((New System.Diagnostics.StackTrace).GetFrame(1).GetMethod.Name)
This will display a Message Box as with calling method name.
Upvotes: 12
Reputation: 8447
Do not try using StackFrame. It will work only in debug mode which is a killer for application speed.
There is no way you can get this info in Release mode, you should consider changing design and adding parameter.
Upvotes: 0
Reputation: 16923
I am using using this code for getting the calling method
string methodName = new StackFrame( 1, true ).GetMethod().Name;
methodName = " [" + methodName + "]";
return methodName;
remember to add namespace Diagnostics
Upvotes: -1
Reputation: 9146
You should be able to get this from the StackFrame with the constructor telling it how many frames to go up the chain, so getting the parent would use 1 (the frame is zero based, so 0 is the current method):
Dim stackTrace as New Diagnostics.StackFrame(1)
Return stackTrace.GetMethod.Name
Upvotes: 0
Reputation: 99490
You need to instantiate the StackFrame
with an appropriate constructor. For example,
Dim stackframe As New Diagnostics.StackFrame(1)
will skip one stack frame (the logging method itself) and get the frame for the caller of that method.
That said - if at all possible, I'd strongly recommend using a standard logging mechanism such as log4net.
Upvotes: 13