Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get caller method from extension method

Tags:

c#

.net

I've a little problem with getting the caller for my extension method.

Searched the internet but couldn't find anything simular to my problem. This question was a close call...

I've a extension method :

public static void TabToNextField(this FrameworkElement i, FrameworkElement nextField)
{
   i.KeyPress(Keys.Tab);
   var isNextFieldFocused = nextField.GetProperty<bool>("IsFocused");

   if (!isNextFieldFocused)
   {
       //Taborder is incorrect. Next field wasn't focused!
       //This wont work since 'this' can't be used in a static context.
       var currentProcedure = this.GetType().Name;   
       var fromField = i.AutomationId;
       var toField = nextField.AutomationId;
       //Log to file..
   }
}

This is used for some automated tests to validate if the nextfield has focus and the tab order is correct. But for the error that should be logged i would like to get the Class name of the caller to get a accurate report that we can directly see where the error is in our application.

Since all the controls are using AutomationId the controls are easy to identify..

So the question is: How can i get the caller method from this extension method?

like image 977
Jonas W Avatar asked Oct 02 '12 09:10

Jonas W


1 Answers

While CallerMemberName is indeed handy, you can also use the StackTrace class, which is avaiable in all framework versions.


LINQPad Example:

void Main()
{
    "Test".Test();
}

static class Extensions
{
    public static void Test(this string s)
    {
        var method = new StackTrace().GetFrame(1).GetMethod();
        Console.WriteLine(String.Format("I was called from '{0}' of class '{1}'", method.Name, method.DeclaringType));
    }
}

Output:

I was called from 'Main' of class 'UserQuery'

like image 61
sloth Avatar answered Oct 08 '22 22:10

sloth