2010-06-22 14 views

Respuesta

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

Ahora vamos a decir que tiene otra clase como esta:

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

nombre será "Call" y el tipo será "llamante"

ACTUALIZACIÓN Dos años más tarde, ya Todavía estoy recibiendo votos por adelantado en este

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

Ir con el ejemplo anterior:

public class SomeClass 
{ 
    public void SomeMethod([CallerMemberName]string memberName = "") 
    { 
     Console.WriteLine(memberName); //output will be name of calling method 
    } 
} 
+1

¡Muy limpio y al grano! – AieshaDot

+9

Esta es la mejor solución que puede obtener, pero debe recordar que esto no necesariamente arrojará la respuesta esperada en versiones compiladas, a menos que deshabilite el método JIT en línea. –

+0

@Greg Beech: cierto. No es un problema aquí porque no usaría la reflexión en ningún tipo de compilación de versiones en ningún caso. –

7

Sí, en principe es posible, pero no es gratis.

Necesita crear un StackTrace, y luego puede echar un vistazo al StackFrame's de la pila de llamadas.

20

Puede usarlo usando el StackTrace y luego puede 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); 
+0

https://stackoverflow.com/questions/171970/how-can-i-find-the-method-that-called-the-current-method – Pakk

10

En realidad es algo que se puede hacer utilizando una combinación de los datos de la pila-traza actual, y la 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 llama MyMethod

6

Técnicamente, puede utilizar StackTrace, pero esto es muy lento y no le dará las respuestas que espera una gran cantidad de el tiempo. Esto se debe a que durante el lanzamiento pueden producirse optimizaciones que eliminarán ciertas llamadas a métodos. Por lo tanto, no puede estar seguro en el lanzamiento de si stacktrace es "correcto" o no.

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

+1

Esto es A. una compilación de depuración, y B. llama a otros ensamblados. El tiempo que lleva iniciar los otros programas a través de System.Diagnostics.Process empequeñece todo lo que se haya incurrido al usar la clase StackFrame. –

+0

Estoy haciendo esto a los fines de la configuración automática de un banco de pruebas. –

Cuestiones relacionadas