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

Questo codice restituirà una stringa oscura in questo modo: <Main>b__0.Utilizzo di MethodInfo.GetCurrentMethod() in metodi anonimi

C'è un modo per ignorare i metodi anonimi e ottenere un nome di metodo più leggibile?

+6

E che nome vi aspettate per un metodo _anonymous_ ?? –

+0

Non ho rancore per MS anon. generatore di nome del metodo. Mi chiedevo solo se c'è un modo di scavare nella traccia dello stack per il metodo non anonimo più vicino? C'è un modo per sapere che un'istanza MethodInfo è anonima? – HuBeZa

risposta

6

è possibile catturare al di fuori :

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

Diverso da quello; no.

+0

Sì. Penso che le variabili catturate siano la soluzione migliore e più semplice. – HuBeZa

6

No, non c'è. Ecco perché è un metodo anonimo. Il nome viene automaticamente generato dal compilatore e garantito come univoco. Se si desidera ottenere il nome del metodo di chiamata si potrebbe passare come argomento:

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

o se si vuole veramente un nome significativo è necessario fornire:

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

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

Purtroppo, non posso passare i parametri perché si tratta di un'API di terze parti e non voglio completarlo solo per quello. C'è un modo per scavare nella traccia dello stack? C'è un modo per sapere che l'istanza di 'MethodInfo' è anonima? – HuBeZa

+2

@HuBeZa, è possibile verificare se MethodInfo è decorato con l'attributo '[CompilerGenerated]'. Questa è una condizione richiesta e un buon candidato per essere un metodo anonimo ma ovviamente non sufficiente: 'var isCompilerGenerated = MethodInfo.GetCurrentMethod(). IsDefined (typeof (CompilerGeneratedAttribute), true);' –

3

Se si desidera ottenere il nome della funzione in cui risiede il metodo anonimo, è possibile spostarsi nello stack e ottenere il nome del metodo di chiamata. Si noti però che ciò funzionerebbe solo fino a quando il nome del metodo desiderato è un gradino superiore nella gerarchia. Forse c'è un modo di viaggiare fino a raggiungere un metodo non anonimo.

Per ulteriori informazioni si veda: http://www.csharp-examples.net/reflection-calling-method-name/