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

Este código devolverá una cadena oscura como la siguiente: <Main>b__0.Usando MethodInfo.GetCurrentMethod() en métodos anónimos

¿Hay alguna manera de ignorar los métodos anónimos y obtener un nombre de método más legible?

+6

Y qué nombre se puede esperar de un método _anonymous_ ?? –

+0

No guardo rencor por MS anon. generador de nombre de método Me pregunto si hay una forma de buscar en el seguimiento de la pila el método no anónimo más cercano. ¿Hay alguna manera de saber que una instancia de MethodInfo es anónima? – HuBeZa

Respuesta

6

Usted puede capturar fuera :

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

Aparte de eso; no.

+0

Sí. Creo que las variables capturadas es la mejor y más simple solución. – HuBeZa

6

No, no lo hay. Es por eso que es un método anónimo. El nombre es generado automáticamente por el compilador y se garantiza que es único. Si desea obtener el nombre de método de llamada que podría pasarlo como argumento:

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

o si realmente desea un nombre significativo deberá proporcionarla:

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

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

Lamentablemente, no puedo pasar parámetros porque es una API de terceros, y no quiero envolverlo solo por eso. ¿Hay alguna manera de excavar en el rastro de la pila? ¿Hay alguna forma de saber que una instancia de 'MethodInfo' es anónima? – HuBeZa

+2

@HuBeZa, puede probar si MethodInfo está decorado con el atributo '[CompilerGenerated]'. Esta es una condición obligatoria y un buen candidato para ser un método anónimo pero obviamente no es condición suficiente: 'var isCompilerGenerated = MethodInfo.GetCurrentMethod(). IsDefined (typeof (CompilerGeneratedAttribute), true);' –

3

Si está buscando obtener el nombre de la función en la que reside el método anónimo, puede recorrer la pila y obtener el nombre del método de llamada. Sin embargo, tenga en cuenta que esto solo funcionará siempre que el nombre del método deseado sea un paso más en la jerarquía. Quizás haya una forma de viajar hasta llegar a un método que no sea anónimo.

Para más información ver: http://www.csharp-examples.net/reflection-calling-method-name/

Cuestiones relacionadas