5

.NET 4.5には、 [CallerMemberNameAttribute]という新しい属性があり、メソッドのパラメーターにアタッチすると、そのメソッドを呼び出しメソッドの文字列名が提供されます(意味がある場合)。

ただし、残念ながら(XNAで何かを作りたいので)私は.NET4.0のみを対象としています。

私は次のようなことができるようになりたいです:

void MethodA() {
   MethodB();
}

void MethodB() {
   string callingMethodName = (...?);
   Console.WriteLine(callingMethodName);
}

私の出力はMethodAになります。

スタックトレースを介してこれを実行できることはわかっていますが、それはa)信頼性が低くb)Sloooow ...ですから、その情報を収集する他の方法があるかどうか疑問に思っていますが、それは...

私は、この問題に関して誰かが持っているかもしれないアイデアや知識を期待していました。前もって感謝します :)

4

2 に答える 2

13

Visual Studio 2012を使用してこれをコンパイルするCallerMemberNameAttributeと、.NET 4.0または3.5をターゲットにしている場合でも、独自に作成して.NET4.5の場合と同じように使用できます。コンパイラは、古いフレームワークバージョンを対象としても、コンパイル時に置換を実行します。

プロジェクトに以下を追加するだけでうまくいきます。

namespace System.Runtime.CompilerServices
{
    public sealed class CallerMemberNameAttribute : Attribute { }
}
于 2012-06-30T20:24:28.380 に答える
0

呼び出されたメソッドのパラメーターとして呼び出し元の名前を指定できます。求めているものとは異なりますが、スタックフレームにアクセスしなくても機能します。

[MethodImpl(MethodImplOptions.NoInlining)]
void MethodA() 
{
    string methodName = System.Reflection.MethodBase.GetCurrentMethod().Name;
    MethodB(methodName);
}

void MethodB(string callingMethodName) 
{
    Console.WriteLine(callingMethodName);
}

を使用MethodBase.GetCurrentMethod()することで、実装がリファクタリングに対して安全であり続けることを保証できます。メソッドの名前が変更されても、結果は正しいままです。

MethodImplOptions.NoInliningメソッドのインライン化を避けるために、呼び出し元のメソッドにマークを付けることを忘れないでください。

于 2012-06-30T20:52:05.527 に答える