2012-07-06 25 views
15

¿Cómo puedo encontrar el nombre completo de un método de llamada en C#. He visto soluciones:Cómo encontrar el nombre completo del método de llamada C#

How I can get the calling methods in C#

How can I find the method that called the current method?

Get Calling function name from Called function

Pero sólo dame el nivel superior. Considere el ejemplo:

namespace Sandbox 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      test(); 
     } 

     static void test() 
     { 
      var stackTrace = new StackTrace(); 
      var methodBase = stackTrace.GetFrame(1).GetMethod(); 
      Console.WriteLine(methodBase.Name); 
     } 
    } 
} 

Esto simplemente da salida a 'Principal' ¿Cómo puedo conseguirlo para imprimir 'Sandbox.Program.Main'?

Antes de que alguien empiece a preguntar por qué necesito usar esto, es para un marco de registro simple en el que estoy trabajando.

EDITAR

Adición en respuesta de Matzi:

Aquí está la solución:

namespace Sandbox 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      test(); 
     } 

     static void test() 
     { 
      var stackTrace = new StackTrace(); 
      var methodBase = stackTrace.GetFrame(1).GetMethod(); 
      var Class = methodBase.ReflectedType; 
      var Namespace = Class.Namespace;   //Added finding the namespace 
      Console.WriteLine(Namespace + "." + Class.Name + "." + methodBase.Name); 
     } 
    } 
} 

Produce 'Sandbox.Program.Main' como tiene que

+1

posible duplicado de [Utilización System.Reflection obtener un método Nombre Completo] (http://stackoverflow.com/questions/2968352/using-system-reflection-to-get-a-methods-full -name) – user7116

Respuesta

27

Esto es algo como here.

MethodBase method = stackTrace.GetFrame(1).GetMethod(); 
string methodName = method.Name; 
string className = method.ReflectedType.Name; 

Console.WriteLine(className + "." + methodName); 
+0

Gracias! Edité la pregunta solo para agregar cómo descubrí el Espacio de nombres. –

+2

No funciona. El método puede no ser el método de llamada, sino uno de los que están fuera: es posible que el método de llamada ya no exista, es decir, que esté inlineado. – TomTom

+0

¿Es posible obtener clases anidadas también? Si hice una clase dentro del programa, vamos a llamarlo 'Foo', y tengo un método en' Foo' (vamos a llamarlo 'Bar') llamada' Program.test() 'Debería imprimir' Sandbox.Program.Foo .Bar' –

0

en System.Reflection.MethodBase método GetCurrentMethod puede encontrar información completa acerca de pila de llamadas usando clases etc

+0

¿Cómo? ['GetCurrentMethod'] (https://msdn.microsoft.com/en-us/library/system.reflection.methodbase.getcurrentmethod (v = vs.110) .aspx) devuelve un [' MethodBase'] (https://msdn.microsoft.com/en-us/library/system.reflection.methodbase(v=vs.110).aspx) que no parece exponer nada sobre el seguimiento de la pila (excepto el tipo actual). – c24w

4

Creo que la mejor manera de obtener el nombre completo es:

this.GetType().FullName + "." + System.Reflection.MethodBase.GetCurrentMethod().Name; 

o intento esto

string method = string.Format("{0}.{1}", MethodBase.GetCurrentMethod().DeclaringType.FullName, MethodBase.GetCurrentMethod().Name); 
0

Con este método usted puede obtener de manera confiable el máximo nombrar

public void HandleException(Exception ex, [CallerMemberName] string caller = "") 
    { 
     if (ex != null) 
     { 
      while (ex.InnerException != null) 
       ex = ex.InnerException; 

      foreach (var method in new StackTrace().GetFrames()) 
      { 
       if (method.GetMethod().Name == caller) 
       { 
        caller = $"{method.GetMethod().ReflectedType.Name}.{caller}"; 
        break; 
       } 
      } 

      Console.WriteLine($"Exception: {ex.Message} Caller: {caller}()"); 
     } 
    } 
Cuestiones relacionadas