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

Dieser Code wird eine obskure Zeichenfolge wie folgt zurückgeben: <Main>b__0.Verwenden von MethodInfo.GetCurrentMethod() in anonymen Methoden

Gibt es eine Möglichkeit, die anonymen Methoden zu ignorieren und einen besser lesbaren Methodennamen zu erhalten?

+6

Und welchen Namen haben Sie für eine _anonymous_ Methode erwarten ?? –

+0

Ich habe keinen Groll für MS anon. Methodenname-Generator. Ich habe mich nur gefragt, ob es eine Möglichkeit gibt, die Stack-Spur für die nächste nicht-anonyme Methode zu durchsuchen. Gibt es eine Möglichkeit zu wissen, dass eine MethodInfo-Instanz anonym ist? – HuBeZa

Antwort

6

Man könnte es erfassen außerhalb :

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

Anders als das; Nein.

+0

Ja. Ich halte gefangene Variablen für die beste und einfachste Lösung. – HuBeZa

6

Nein, gibt es nicht. Deshalb ist es eine anonyme Methode. Der Name wird automatisch vom Compiler generiert und garantiert eindeutig. Wenn Sie die Rufmethode Namen bekommen könnte man es als Argument übergeben:

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

oder wenn Sie wirklich einen aussagekräftigen Namen wollen, müssen Sie es zur Verfügung stellen müssen:

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

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

Leider kann ich keine Parameter übergeben, da es sich um eine API von Drittanbietern handelt, und ich möchte sie nicht nur dafür umbrechen. Gibt es eine Möglichkeit, die Stack-Spur zu graben? Gibt es eine Möglichkeit zu wissen, dass eine MethodInfo-Instanz anonym ist? – HuBeZa

+2

@HuBeZa, könnten Sie testen, ob die MethodInfo mit dem Attribut '[CompilerGenerated]' versehen ist. Dies ist eine erforderliche Bedingung und eine gute Voraussetzung für eine anonyme Methode, aber offensichtlich keine ausreichende Bedingung: 'var isCompilerGenerated = MethodInfo.GetCurrentMethod(). IsDefined (typeof (CompilerGeneratedAttribute), wahr);' –

3

Wenn Sie nach dem Namen der Funktion suchen, in der sich die anonyme Methode befindet, können Sie den Stapel übertragen und den Namen der aufrufenden Methode abrufen. Beachten Sie jedoch, dass dies nur so lange funktioniert, wie der gewünschte Methodenname einen Schritt in der Hierarchie darstellt. Vielleicht gibt es eine Möglichkeit, bis zu einer nicht anonymen Methode zu reisen.

Weitere Informationen finden Sie unter: http://www.csharp-examples.net/reflection-calling-method-name/

Verwandte Themen