2009-01-07 15 views

Respuesta

0

Ver esta pregunta:
Can you use reflection to find the name of the currently executing method?

No es un duplicado, pero la respuesta a esa pregunta contestará el suyo también.

+1

No realmente, porque si bien es posible obtener el método de llamada, eso no le dice el tipo real del objeto que realiza la llamada. Por ejemplo, podría estar en BaseClass.Foo() pero desde una instancia de DerivedClass que implementa una interfaz que Andrew está buscando. –

+0

Sin embargo, te da un rastro de pila. –

+1

Sí, pero la forma en que leo la pregunta no es suficiente. –

18

No, no hay, al menos no sin utilizar una API de perfilado/depuración de alguna descripción. Puede recorrer la pila para encontrar el método de llamada , con la advertencia de que es muy lento y puede ser impreciso debido a las optimizaciones de JIT. Sin embargo, eso no le indicará el objeto que llama (si es que lo hay).

+0

Aaaah - ¿entonces presumiblemente VS lo hace de alguna manera complicada al instrumentar el código? –

+0

Bueno, no instrumentando el código sino ejecutando las API del depurador que proporcionan todo tipo de información, a un precio, por supuesto. –

+2

Oooh: ¿dónde puedo encontrar más información sobre estas API de depurador? –

2

Si desea obtener el tipo puede probar esto:.

nueva StackFrame (1) .GetMethod() DeclaringType

Como Jon señaló que podría haber problemas si llegas a tener optimisizations JIT.

En cuanto a obtener datos del objeto, no creo que sea posible.

Editar

Sólo para explicar en detalle el problema de optimización, tome el siguiente código:

class stackTest 
    { 
     public void Test() 
     { 
      StackFrame sFrame = new StackFrame(1); 
      if (sFrame == null) 
      { 
       Console.WriteLine("sFrame is null"); 
       return; 
      } 

      var method = sFrame.GetMethod(); 

      if (method == null) 
      { 
       Console.WriteLine("method is null"); 
       return; 
      } 
      Type declaringType = method.DeclaringType; 
      Console.WriteLine(declaringType.Name); 
     } 

     public void Test2() 
     { 
      Console.WriteLine(new StackFrame(1).GetMethod().DeclaringType.Name); 
     } 
    } 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      stackTest s = new stackTest(); 
      s.Test(); 
      Console.WriteLine("Doing Test2"); 
      s.Test2(); 
      Console.ReadLine(); 

     } 
    } 

Deberíamos Programa para la consola dos veces, y cuando se ejecuta dentro del depurador que haces. Cuando ejecuta sin el depurador en modo de liberación, obtiene el resultado de la primera función de prueba. Lo cual es probally porque es complejo ser inline; sin embargo, el segundo método causa una excepción de referencia nula.

Otro peligro con este código es que en MS mejora el compilador JIT lo que podría haber funcionado en 2.0 podría colapsar y grabarse en versiones futuras.

Cuestiones relacionadas