Está en la StackFrame ...
private string GetExecutingMethodName()
{
string result = "Unknown";
StackTrace trace = new StackTrace(false);
Type type = this.GetType();
for (int index = 0; index < trace.FrameCount; ++index)
{
StackFrame frame = trace.GetFrame(index);
MethodBase method = frame.GetMethod();
if (method.DeclaringType != type && !type.IsAssignableFrom(method.DeclaringType))
{
result = string.Concat(method.DeclaringType.FullName, ".", method.Name);
break;
}
}
return result;
}
Este método fue escrito para una clase de controlador de registro y el uso de GetType() simplemente elimina los métodos dentro de la clase de controlador de registro sea devuelta como la ejecución de la última método. Como la clase de controlador de registro se escribió para más que solo registrar excepciones, se requirió un nuevo objeto de StackTrace. Obviamente, para encontrar "el método que lanzó la excepción" GetType() podría no ser necesario.
Si solo quieres la parte superior de la pila, toma el primer cuadro, llama a GetMethod() y devuelve eso, o simplemente usa TargetSite. GetType() podría ser eliminado. También tenga en cuenta que la Excepción debería pasarse para crear el objeto StackTrace. Por ejemplo:
class Program
{
static void Main(string[] args)
{
try
{
Test();
}
catch (Exception ex)
{
// does not work properly - writes "Main"
Console.WriteLine(MethodBase.GetCurrentMethod());
// properly writes "TestConsole.Program.Test"
Console.WriteLine(GetExecutingMethodName(ex));
// properly writes "Test"
Console.WriteLine(ex.TargetSite.Name);
}
Console.ReadKey();
}
static void Test()
{
throw new Exception("test");
}
private static string GetExecutingMethodName(Exception exception)
{
var trace = new StackTrace(exception);
var frame = trace.GetFrame(0);
var method = frame.GetMethod();
return string.Concat(method.DeclaringType.FullName, ".", method.Name);
}
}
Básicamente, si TargetSite() hace lo que usted desea, entonces no continúe.Pero, muchas veces en los controladores de registro, un objeto de excepción no está disponible (es decir, rastreo y auditoría) por lo que es necesario un nuevo objeto StackTrace() para recuperar el último método ejecutado, el anterior ANTES del método de registro.
¿La respuesta simple? Es el método en la parte superior de la pila de llamadas. Este es el método que se llamó más recientemente antes de que se produjera la excepción. :) – Chiramisu
Lo resolví al marcar esta respuesta http://stackoverflow.com/questions/27997276/get-method-name-that-threw-exception –