How do I get the calling method name and type using reflection? [duplicate]
Possible Duplicate:
How can I find the method that called the current method?
I'd like to write a method which obtains the name of the calling method, and the name of the class containing the calling method.
Is it possible with C# reflection?
Solution 1:
public class SomeClass
{
public void SomeMethod()
{
StackFrame frame = new StackFrame(1);
var method = frame.GetMethod();
var type = method.DeclaringType;
var name = method.Name;
}
}
Now let's say you have another class like this:
public class Caller
{
public void Call()
{
SomeClass s = new SomeClass();
s.SomeMethod();
}
}
name will be "Call" and type will be "Caller".
UPDATE: Two years later since I'm still getting upvotes on this
In .NET 4.5 there is now a much easier way to do this. You can take advantage of the CallerMemberNameAttribute
.
Going with the previous example:
public class SomeClass
{
public void SomeMethod([CallerMemberName]string memberName = "")
{
Console.WriteLine(memberName); // Output will be the name of the calling method
}
}
Solution 2:
You can use it by using the StackTrace
and then you can get reflective types from that.
StackTrace stackTrace = new StackTrace(); // get call stack
StackFrame[] stackFrames = stackTrace.GetFrames(); // get method calls (frames)
StackFrame callingFrame = stackFrames[1];
MethodInfo method = callingFrame.GetMethod();
Console.Write(method.Name);
Console.Write(method.DeclaringType.Name);
Solution 3:
It's actually something that can be done using a combination of the current stack-trace data, and reflection.
public void MyMethod()
{
StackTrace stackTrace = new System.Diagnostics.StackTrace();
StackFrame frame = stackTrace.GetFrames()[1];
MethodInfo method = frame.GetMethod();
string methodName = method.Name;
Type methodsClass = method.DeclaringType;
}
The 1
index on the StackFrame
array will give you the method which called MyMethod
Solution 4:
Yes, in principe it is possible, but it doesn't come for free.
You need to create a StackTrace, and then you can have a look at the StackFrame's of the call stack.