Reputation: 3250
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?
Upvotes: 5
Views: 2657
Reputation: 3250
My solution was by using the CallerMemberName in .Net 4.5. So the final solution was as following :
public static void TabToNextField(this FrameworkElement i
, FrameworkElement nextField
, [CallerMemberName] string memberName = "")
{
i.KeyPress(Keys.Tab);
var isNextFieldFocused = nextField.GetProperty<bool>("IsFocused");
if (!isNextFieldFocused)
{
//Taborder is incorrect. Next field wasn't active!
var currentProcedure = memberName;
var fromField = i.AutomationId;
var toField = nextField.AutomationId;
}
}
I hope this can help someone with simular issues.
Upvotes: 7
Reputation: 101072
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'
Upvotes: 6