1

このヘルパーを使用して、ログ記録のために現在実行されているメソッドの名前を解決しています。

    [MethodImpl(MethodImplOptions.NoInlining)]
    public static string GetCurrentMethod()
    {
        StackTrace st = new StackTrace();
        StackFrame sf = st.GetFrame(1);

        return sf.GetMethod().Name;
    }

これは返される文字列です<Frequency>b__46

" b__46 はどういう意味ですか? また、「周波数」という単語を取得する方法はありますか?

これはヘルパーを呼び出しています。

    return ProxyCallWrapper.Execute<bool, IBackendJob>((backend, header) =>
    {
        header.CorrelationID = CorrelationID;
        logger.LogInfo(string.Format("### BSL CALL from {0} by {1} : CorrelationID: {2}", this.ToString(), GetCurrentMethod() ,header.CorrelationID));
        return backend.AddJob(header, jobId);
    });
4

2 に答える 2

4

メソッドがラムダ式から呼び出されている可能性があります。C# コンパイラは実際に、ラムダをクラス内の隠しメソッドに変換します。これらのメソッドには、ご覧のように、コンパイラによって生成された特別な名前があり<Frequency>b__46ます。見ればわかると思いますがGetFrame(2)、期待する名前が表示されます。関数は、有効なメソッド名が見つかるまでスタックをループすることにより、ラムダを無視できます (メソッド記述子のIsSpecialNameプロパティを確認できます)。

コンパイラは、自動プロパティのゲッターとセッター、イベントの追加/削除ハンドラー、およびその他のケース (これらの自動生成されたメソッドはあなたのGetCurrentMethod(). ただし、手動のプロパティ ゲッターとセッターには のような「特別な」名前が付けられていることにも注意してget_PropertyName()くださいGetCurrentMethod()

于 2014-02-04T22:28:48.233 に答える