我为扩展方法获取调用者时遇到了一些问题。
搜索了互联网,但找不到与我的问题相似的任何内容。 This question是一个近距离的电话......
我有一个扩展方法:
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..
}
}
这用于某些自动化测试,以验证nextfield是否具有焦点且Tab键顺序是否正确。但是对于应该记录的错误,我想得到调用者的类名,以获得准确的报告,我们可以直接看到错误在我们的应用程序中的位置。
由于所有控件都使用AutomationId,因此控件很容易识别..
所以问题是:如何通过此扩展方法获取调用者方法?
答案 0 :(得分:5)
我的解决方案是使用.Net 4.5中的CallerMemberName。所以最终的解决方案如下:
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;
}
}
我希望这可以帮助有类似问题的人。
答案 1 :(得分:4)
虽然CallerMemberName
确实很方便,但您也可以使用StackTrace
类,这在所有框架版本中均可用。
LINQPad示例:
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));
}
}
<强>输出:强>
我是从“UserQuery”类的'Main'调用的。