Si desea obtener el tipo puede probar esto:.
nueva StackFrame (1) .GetMethod() DeclaringType
Como Jon señaló que podría haber problemas si llegas a tener optimisizations JIT.
En cuanto a obtener datos del objeto, no creo que sea posible.
Editar
Sólo para explicar en detalle el problema de optimización, tome el siguiente código:
class stackTest
{
public void Test()
{
StackFrame sFrame = new StackFrame(1);
if (sFrame == null)
{
Console.WriteLine("sFrame is null");
return;
}
var method = sFrame.GetMethod();
if (method == null)
{
Console.WriteLine("method is null");
return;
}
Type declaringType = method.DeclaringType;
Console.WriteLine(declaringType.Name);
}
public void Test2()
{
Console.WriteLine(new StackFrame(1).GetMethod().DeclaringType.Name);
}
}
class Program
{
static void Main(string[] args)
{
stackTest s = new stackTest();
s.Test();
Console.WriteLine("Doing Test2");
s.Test2();
Console.ReadLine();
}
}
Deberíamos Programa para la consola dos veces, y cuando se ejecuta dentro del depurador que haces. Cuando ejecuta sin el depurador en modo de liberación, obtiene el resultado de la primera función de prueba. Lo cual es probally porque es complejo ser inline; sin embargo, el segundo método causa una excepción de referencia nula.
Otro peligro con este código es que en MS mejora el compilador JIT lo que podría haber funcionado en 2.0 podría colapsar y grabarse en versiones futuras.
No realmente, porque si bien es posible obtener el método de llamada, eso no le dice el tipo real del objeto que realiza la llamada. Por ejemplo, podría estar en BaseClass.Foo() pero desde una instancia de DerivedClass que implementa una interfaz que Andrew está buscando. –
Sin embargo, te da un rastro de pila. –
Sí, pero la forma en que leo la pregunta no es suficiente. –