Getting current method info for logging

S

ssg31415926

Is there any way to get the name of the method that called the current
method?

Also, is there any way to get the values of the parameters passed into
the method, along with the parameter names?

I want to write a method that I can call at the start of each method
for logging purposes.
It'll check if the logging level is high enough, and if so, record the
method name and each parameter name and value.

I realise I can use reflection to get the name of the current method
and the names of the parameters. How can I get the name of the method
that called the current method? Or is the only way to do this to pass
System.Reflection.MethodBase.GetCurrentMethod() as a parameter?
And how can I get the values of the parameters? I was hoping there'd
be a Key-Value collection containing them but can't find anything.
Failing that, is there a way to say 'give me the value of the
parameter named in this string'?
 
M

Morten Wennevik [C# MVP]

Is there any way to get the name of the method that called the current
method?

Also, is there any way to get the values of the parameters passed into
the method, along with the parameter names?

I want to write a method that I can call at the start of each method
for logging purposes.
It'll check if the logging level is high enough, and if so, record the
method name and each parameter name and value.

I realise I can use reflection to get the name of the current method
and the names of the parameters. How can I get the name of the method
that called the current method? Or is the only way to do this to pass
System.Reflection.MethodBase.GetCurrentMethod() as a parameter?
And how can I get the values of the parameters? I was hoping there'd
be a Key-Value collection containing them but can't find anything.
Failing that, is there a way to say 'give me the value of the
parameter named in this string'?

Yes, you can use System.Diagnostics.StackFrame information to find what method called this method, or what method called the last method and so on.

StackFrame frame = new StackFrame(1);
MessageBox.Show(frame.GetMethod().Name); // Shows the name of the calling method

new StackFrame(2).GetMethod() would get the method calling the method calling this method, and so on.
 
G

GlennDoten

Morten said:
Yes, you can use System.Diagnostics.StackFrame information to find what method called this method, or what method called the last method and so on.

StackFrame frame = new StackFrame(1);
MessageBox.Show(frame.GetMethod().Name); // Shows the name of the calling method

new StackFrame(2).GetMethod() would get the method calling the method calling this method, and so on.

It can get a little trickier if your actual logging method has
overloads. Say you have this:

public static void Log(string message)
{
Log(message, null);
}

public static void Log(string message, Timer t)
{
// Do the actual logging here. You'll have to
// "walk up the stack" to a method that is not
// "Log" to find out who "really" called us.
// Otherwise, if someone calls the first
// overload to Log then StackFrame(1) here
// would tell us Log called us and that's
// not really what you want to know.
}

I posted some sample code for this just this week:

http://groups.google.com/group/microsoft.public.dotnet.languages.csharp/msg/041a63f49c624609

HTH.
 
G

Guest

Here a code (for instance ), Get a method name and other data stuff :

// now frameIndex is the first 'user' caller frame
StackFrame aFrame = st.GetFrame(frameIndex);

if (aFrame != null)
{
System.Reflection.MethodBase method = aFrame.GetMethod();

if (method != null)
{
m_methodName = method.Name;
if (method.DeclaringType != null)
{
m_className = method.DeclaringType.FullName;
}
}
m_fileName = aFrame.GetFileName();
m_lineNumber =
aFrame.GetFileLineNumber().ToString(System.Globalization.NumberFormatInfo.InvariantInfo);
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top