5

我在为我的扩展方法获取调用者方面遇到了一点问题。

在互联网上搜索,但找不到与我的问题类似的任何东西。 这个问题是千钧一发...

我有一个扩展方法:

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..
   }
}

这用于一些自动化测试,以验证下一个字段是否具有焦点以及选项卡顺序是否正确。但是对于应该记录的错误,我想获取调用者的类名以获得准确的报告,我们可以直接看到错误在我们的应用程序中的位置。

由于所有控件都使用 AutomationId,因此控件很容易识别..

所以问题是:如何从这个扩展方法中获取调用者方法?

4

2 回答 2

6

我的解决方案是使用 .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;
    }
}

我希望这可以帮助有类似问题的人。

于 2012-10-02T09:23:39.877 回答
6

虽然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”中调用的

于 2012-10-02T09:34:30.570 回答