How to determine calling method and class name?

Neurodefekt picture Neurodefekt · Feb 13, 2013 · Viewed 67.1k times · Source

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?

Answer

Jens Kloster picture Jens Kloster · Feb 13, 2013

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.