How to determine calling method and class name?

69,288

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.

Share:
69,288
Neurodefekt
Author by

Neurodefekt

Updated on July 21, 2022

Comments

  • Neurodefekt
    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
    Mike Zboray over 11 years
    Two things: 1) This can significantly affect performance 2) In optimized code, method inlining can cause an incorrect method name to be printed.
  • Colin Zabransky
    Colin Zabransky over 5 years
    If performance isn't a concern, you can use MethodImpl to enforce no inlining: [MethodImpl(MethodImplOptions.NoInlining)]
  • Domin
    Domin over 5 years
    The 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 suggest var cls = mth.DeclaringType.Name; to the the class name