¿Cómo obtengo el nombre y el tipo del método de llamada usando reflexión? [duplicar]


Posible Duplicado:
¿Cómo puedo encontrar el método que llamó al método actual?

Me gustaría escribir un método que obtiene el nombre del método de llamada, y el nombre de la clase que contiene el método de llamada.

¿Es posible con la reflexión en C#?

 153
Author: Community, 2010-06-22

5 answers

public class SomeClass
{
    public void SomeMethod()
    {
        StackFrame frame = new StackFrame(1);
        var method = frame.GetMethod();
        var type = method.DeclaringType;
        var name = method.Name;
    }
}

Ahora digamos que tienes otra clase como esta:

public class Caller
{
   public void Call()
   {
      SomeClass s = new SomeClass();
      s.SomeMethod();
   }
}

El nombre será " Call "y el tipo será"Caller"

ACTUALIZAR Dos años después ya que todavía estoy recibiendo votos positivos en este

En.Net 4.5 ahora hay una forma mucho más fácil de hacer esto. Usted puede tomar ventaja de la CallerMemberNameAttribute

Siguiendo el ejemplo anterior:

public class SomeClass
{
    public void SomeMethod([CallerMemberName]string memberName = "")
    {
        Console.WriteLine(memberName); //output will be name of calling method
    }
}
 394
Author: BFree,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-02 10:47:18

Puedes usarlo usando el StackTrace y luego puedes obtener tipos reflectantes de eso.

StackTrace stackTrace = new StackTrace();           // get call stack
StackFrame[] stackFrames = stackTrace.GetFrames();  // get method calls (frames)

StackFrame callingFrame = stackFrames[1];
MethodInfo method = callingFrame.GetMethod();
Console.Write(method.Name);
Console.Write(method.DeclaringType.Name);
 21
Author: Aren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-22 17:56:44

En realidad es algo que se puede hacer usando una combinación de los datos actuales de seguimiento de pila y reflexión.

public void MyMethod()
{
     StackTrace stackTrace = new System.Diagnostics.StackTrace();
     StackFrame frame = stackTrace.GetFrames()[1];
     MethodInfo method = frame.GetMethod();
     string methodName = method.Name;
     Type methodsClass = method.DeclaringType;
}

El índice 1 en la matriz StackFrame le dará el método que llamó MyMethod

 10
Author: ckramer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-06 10:47:43

Sí, en príncipe es posible, pero no es gratis.

Necesitas crear un StackTrace, y luego puedes echar un vistazo al StackFrame de la pila de llamadas.

 7
Author: Lucero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-22 17:53:23

Técnicamente, puede usar StackTrace, pero esto es muy lento y no le dará las respuestas que espera mucho del tiempo. Esto se debe a que durante las compilaciones de lanzamiento pueden ocurrir optimizaciones que eliminarán ciertas llamadas a métodos. Por lo tanto, no puede estar seguro en la versión si stacktrace es "correcto" o no.

Realmente, no hay ninguna manera infalible o rápida de hacer esto en C#. Realmente debería preguntarse por qué necesita esto y cómo puede diseñar su aplicación, para que pueda hacerlo lo que quieres sin saber qué método lo llamó.

 7
Author: Bishnu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-17 16:07:26