sirve qué que programacion para método metodos metodo funciones firma ejemplos ejemplo definicion c# reflection

qué - metodos y funciones en c#



¿Cómo obtengo el nombre y el tipo de método de llamada usando reflexión? (5)

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

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

¿Es posible con C # reflexión?


En realidad, se puede hacer algo con una combinación de los datos actuales de seguimiento de la pila 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 llamó MyMethod


Puede usarlo usando StackTrace y luego puede obtener tipos reflexivos a partir 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);


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

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


Técnicamente, puedes usar StackTrace, pero esto es muy lento y no te dará las respuestas que esperas la mayor parte del 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 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 hacer lo que quiera sin saber qué método lo llamó.


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á "Llamar" y el tipo será "Llamante"

ACTUALIZAR Dos años más tarde, ya que todavía estoy recibiendo upvotes en este

En .Net 4.5 ahora hay una manera mucho más fácil de hacer esto. Puede aprovechar el CallerMemberNameAttribute

Yendo con el ejemplo anterior:

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