2009-08-21 18 views
32

Duplicar posible:
How can I find the method that called the current method?obtienen llamadas nombre de la función de la función llamada

¿Cómo puedo obtener el nombre de función de llamada de la función de llamada en C#?

+1

Duplicado de http://stackoverflow.com/questions/171970/how-can-i-find-the-method-that-called-the-current-method –

+2

Esto es un engaño, pero probablemente vale la pena mantener abierto debido a la terminología diferente - podría ser útil para las personas que buscan. – Keith

+1

@Keith: sí, por eso generalmente tratamos de mantener las preguntas duplicadas cuando se les pregunta de una manera significativamente diferente - es por eso que al cerrarlas automáticamente se agregan los enlaces directamente en la parte superior, para que los buscadores futuros puedan encontrar su camino hacia las respuestas más rápido. – Shog9

Respuesta

70
new StackFrame(1, true).GetMethod().Name 

Tenga en cuenta que en las versiones de lanzamiento el compilador podría inline el método que se llama, en cuyo caso el código anterior podría volver al llamador de la persona que llama, por lo que es seguro que debe adornar su método con:

[MethodImpl(MethodImplOptions.NoInlining)] 
+11

Tenga en cuenta que caminar en la pila de esta manera impondrá un golpe de rendimiento bastante pesado. Recomiendo encarecidamente buscar una solución que no implique una caminata de pila antes de usar una. – jrista

+1

Esta respuesta es en realidad mejor que las respuestas en la pregunta duplicada debido a la mención del atributo MethodImpl. –

+8

Sé que esto es una tontería y etiquetado .net 3.5, pero para ayudar a los buscadores que tropiezan con este primero (como yo), sería bueno indicar en su respuesta que en C# 5.0 ahora puede usar la información de la persona que llama como se describe en: http://visualstudiomagazine.com/articles/2012/11/01/more-than-just-async.aspx – acarlon

14

Esto le dará el nombre del método que está en:

string currentMethod = System.Reflection.MethodBase.GetCurrentMethod().Name; 

Usar con precaución ya que podría haber un impacto en el rendimiento.

To get callers: 
StackTrace trace = new StackTrace(); 
int caller = 1; 

StackFrame frame = trace.GetFrame(caller); 

string callerName = frame.GetMethod().Name; 

Esto utiliza un paseo de pila para obtener el nombre del método. El valor de la persona que llama es qué tan lejos está la pila de llamadas. Tenga cuidado de no ir muy lejos.

+0

Necesito qué método llama al método actual. – Sauron

+0

La forma de obtener el nombre de la persona que llama del registro de la pila, ¿será un golpe de rendimiento? – Panos

Cuestiones relacionadas