2011-01-16 15 views
7
public static void Main(string[] args) 
{ 
    Action a =() => Console.WriteLine(MethodInfo.GetCurrentMethod().Name); 
    a(); 
} 

このコードでは、わかりにくい文字列、つまり<Main>b__0が返されます。匿名メソッドでMethodInfo.GetCurrentMethod()を使用する

匿名メソッドを無視してよりわかりやすいメソッド名を取得する方法はありますか?

+6

そして、あなたは_anonymous_メソッドのために何名を期待していません? –

+0

私はMSのための恨みを持っていません。メソッド名ジェネレータ。最も近い非匿名メソッドのスタックトレースを掘り起こす方法があるのだろうかと疑問に思っただけですか? MethodInfoインスタンスが匿名であることを知る方法はありますか? – HuBeZa

答えて

6

あなたは外にそれをキャプチャすることができ:

var name = MethodInfo.GetCurrentMethod().Name + ":subname"; 
Action a =() => Console.WriteLine(name); 

それ以外は、いいえ。

+0

はい。キャプチャされた変数は、最も簡単で最も簡単なソリューションだと思います。 – HuBeZa

6

いいえ、ありません。だから、それは匿名の方法です。名前はコンパイラによって自動的に生成され、一意であることが保証されています。あなたは、呼び出し元のメソッド名を取得したい場合は、引数として渡すことができます。

public static void Main() 
{ 
    Action<string> a = name => Console.WriteLine(name); 
    a(MethodInfo.GetCurrentMethod().Name); 
} 

をかあなたが本当に意味のある名前にしたい場合、あなたはそれを提供する必要があります。

public static void Main() 
{ 
    Action a = MeaningfullyNamedMethod; 
    a(); 
} 

static void MeaningfullyNamedMethod() 
{ 
    Console.WriteLine(MethodInfo.GetCurrentMethod().Name); 
} 
+0

残念ながら、サードパーティのAPIであるためパラメータを渡すことができません。そのためにパラメータをラップしたくありません。スタックトレースを掘る方法はありますか? 'MethodInfo'インスタンスが匿名であることを知る方法はありますか? – HuBeZa

+2

@HuBeZaでは、MethodInfoが '[CompilerGenerated]'属性で修飾されているかどうかをテストできます。これは必須の条件であり、匿名のメソッドであるが、明らかに十分な条件ではないという良い思いがあります: 'var isCompilerGenerated = MethodInfo.GetCurrentMethod()。IsDefined(typeof(CompilerGeneratedAttribute)、true); ' –

3

匿名メソッドが存在する関数の名前を取得する場合は、スタックを移動して呼び出しメソッドの名前を取得できます。ただし、これは、目的のメソッド名が階層内で1つ上にある限り機能することに注意してください。 匿名ではない方法に到達するまで、旅する方法があります。詳細については

は、以下を参照してください。 http://www.csharp-examples.net/reflection-calling-method-name/

関連する問題