Possible Duplicate:
How can I find the method that called the current method?
I have a method in an object that is called from a number of places within the object. Is there a quick and easy way to get the name of the method that called this popular method.
Pseudo Code EXAMPLE:
public Main()
{
PopularMethod();
}
public ButtonClick(object sender, EventArgs e)
{
PopularMethod();
}
public Button2Click(object sender, EventArgs e)
{
PopularMethod();
}
public void PopularMethod()
{
//Get calling method name
}
Within PopularMethod()
I would like to see the value of Main
if it was called from Main
... I'd like to see "ButtonClick
" if PopularMethod()
was called from ButtonClick
I was looking at the System.Reflection.MethodBase.GetCurrentMethod()
but that won't get me the calling method. I've looked at the StackTrace
class but I really didn't relish running an entire stack trace every time that method is called.
Just pass in a parameter
IMO: If it's good enough for events it should be good enough for this.
I don't think it can be done without tracing the stack. However, it's fairly simple to do that:
However, I think you really have to stop and ask yourself if this is necessary.
This is actually really simple.
But be careful through, I'm a bit skeptical to if inlining the method has any effect. You can do this to make sure that the JIT compiler won't get in the way.
To get the calling method:
I think you do need to use the
StackTrace
class and thenStackFrame.GetMethod()
on the next frame.This seems like a strange thing to use
Reflection
for though. If you are definingPopularMethod
, can't go define a parameter or something to pass the information you really want. (Or put in on a base class or something...)In .NET 4.5 / C# 5, this is simple:
The compiler adds the caller's name automatically; so:
will pass in
"Foo"
.I have often found my self wanting to do this, but have always ending up refactoring the design of my system so I don't get this "Tail wagging the dog" anti-pattern. The result has always been a more robust architecture.