How to determine calling method and class name?
Solution 1
Try doing something like this:
var mth = new StackTrace().GetFrame(1).GetMethod();
var cls = mth.ReflectedType.Name;
// where 1 illustrates how deep into the stack to reflect.
There are more elegant solutions in C# 5.0 >, however if you are using older frameworks, the above will help.
Solution 2
You may just record the full stack trace instead of just the calling method using Environment.StackTrace
. This may help you if you want to use the same logging structure to log exceptions.
Refer to this msdn page for more information.
Neurodefekt
Updated on July 21, 2022Comments
-
Neurodefekt almost 2 years
I'm currently developing a application logging library using the built in TraceListener. This library will be used in many projects and should offer a simple interface where I only have to care about WHAT is going to be written in into the log file, but not HOW.
By using the reflection namespace, I can figure out which application currently called a log function (retrieving execution assembly name), but I want also the name of the function and class that called the logging function.
Let's say I have:
public static void LogInfo(string vLogText) { Trace.WriteLine( MethodInfo.GetCurrentMethod().Name + this.GetType().ToString() + vLogText); }
When I call from another project (class: TestClass, method: TestMethod)
Tracer.LogInfo("log this!")
I expect to see in the log:
TestClass, TestMethod, log this!
But instead I got
TracerClass, LogInfo, log this!
How to get the parent method and class name?
-
Mike Zboray over 11 yearsTwo things: 1) This can significantly affect performance 2) In optimized code, method inlining can cause an incorrect method name to be printed.
-
Colin Zabransky over 5 yearsIf performance isn't a concern, you can use MethodImpl to enforce no inlining:
[MethodImpl(MethodImplOptions.NoInlining)]
-
Domin over 5 yearsThe line
var cls = mth.ReflectedType.Name;
produces the method type including the signature, not only the class name of the instance invoking the method. I suggestvar cls = mth.DeclaringType.Name;
to the the class name