C# 从扩展方法获取调用方方法

C# 从扩展方法获取调用方方法,c#,.net,C#,.net,我在获取扩展方法的调用方时遇到了一个小问题 搜索了互联网,但找不到与我的问题类似的东西。 这是一个千钧一发的时刻 我有一个扩展方法: public static void TabToNextField(this FrameworkElement i, FrameworkElement nextField) { i.KeyPress(Keys.Tab); var isNextFieldFocused = nextField.GetProperty<bool>("IsFocu

我在获取扩展方法的调用方时遇到了一个小问题

搜索了互联网,但找不到与我的问题类似的东西。 这是一个千钧一发的时刻

我有一个扩展方法:

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..
   }
}
public static void TabToNextField(此FrameworkElement i,FrameworkElement nextField)
{
i、 按键(Keys.Tab);
var isNextFieldFocused=nextField.GetProperty(“IsFocused”);
如果(!isNextFieldFocused)
{
//Taborder不正确。下一个字段未聚焦!
//这不起作用,因为“This”不能在静态上下文中使用。
var currentProcedure=this.GetType().Name;
var fromField=i.AutomationId;
var toField=nextField.AutomationId;
//记录到文件。。
}
}
这用于一些自动测试,以验证nextfield是否具有焦点以及选项卡顺序是否正确。但是对于应该记录的错误,我想获取调用方的类名,以获得一个准确的报告,我们可以直接看到错误在应用程序中的位置

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


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

我的解决方案是使用in.Net 4.5。因此,最终的解决方案如下:

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;
    }
}
publicstaticvoidtabtonextfield(此FrameworkElement i
,FrameworkElement nextField
,[CallerMemberName]字符串memberName=“”)
{
i、 按键(Keys.Tab);
var isNextFieldFocused=nextField.GetProperty(“IsFocused”);
如果(!isNextFieldFocused)
{
//Taborder不正确。下一个字段未激活!
var currentProcedure=memberName;
var fromField=i.AutomationId;
var toField=nextField.AutomationId;
}
}

我希望这可以帮助解决simular问题。

虽然
CallerMemberName
确实很方便,但您也可以使用该类,该类在所有框架版本中都可用


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));
    }
}
输出:

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


+1、非常好。甚至都没想到StackTrace。。我认为使用CallerMemberName是解决我原来问题的更好方法。谢谢你的意见!获取一个
StackTrace
非常昂贵,但从另一方面来说,它可以为您提供一个完整的
MethodInfo
,而不仅仅是名称。但是其他属性可以获取源文件和行号,我认为
MethodInfo
无法获取。