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、すべてのフレームワーク バージョンで利用可能なクラスを使用することもできます。


LINQパッドの例:

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 に答える