¿Es posible reflejar una implementación de interfaz explícita desde la pila de llamadas? Quiero usar esta información para buscar un atributo en la interfaz.¿Cómo se refleja en la implementación explícita de la interfaz C# desde la pila de llamadas?
Teniendo en cuenta este código:
interface IFoo
{
void Test();
}
class Foo : IFoo
{
void IFoo.Test() { Program.Trace(); }
}
class Program
{
static void Main(string[] args)
{
IFoo f = new Foo();
f.Test();
}
public static void Trace()
{
var method = new StackTrace(1, false).GetFrame(0).GetMethod();
// method.???
}
}
En concreto, en Trace(), me gustaría ser capaz de obtener a partir de typeof(IFoo)
method
.
En la ventana del reloj, si miro method.ToString()
me da Void InterfaceReflection.IFoo.Test()
(InterfaceReflection es el nombre de mi ensamblaje).
¿Cómo puedo llegar al typeof(IFoo)
desde allí? ¿Debo usar una búsqueda de tipo basada en el nombre del ensamblado en sí, o hay un Type IFoo
escondido en algún lugar en el MethodBase
?
ACTUALIZACIÓN:
Aquí está la solución final, gracias a Kyte
public static void Trace()
{
var method = new StackTrace(1, false).GetFrame(0).GetMethod();
var parts = method.Name.Split('.');
var iname = parts[parts.Length - 2];
var itype = method.DeclaringType.GetInterface(iname);
}
itype
tendrán el tipo de interfaz para el método de aplicación. Esto solo funcionará con implementaciones de interfaz explícitas, pero eso es exactamente lo que necesito. Ahora puedo usar itype
para consultar los atributos asociados al tipo de interfaz real.
Gracias a todos por su ayuda.
¡Ah! Eso es todo, gracias. Solo estaba buscando propiedades, y no pensé en buscar métodos. Creo que 'GetInterfaces()' es lo que puedo usar. Usaré 'method.Name' que me da' InterfaceReflection.IFoo.Test', sacaré el 'IFoo' y usar 'GetInterface()' para encontrar su tipo coincidente. Eso funciona. – scobi
Si Foo implementó más de 1 interfaz, entonces aún tendría que averiguar a cuál pertenece el método ... Además, ¿qué pasa si la prueba no se definió en la interfaz, y era un método real de Foo? – CodingWithSpike
@ rally25rs: Puede ejecutar i.GetMethods() y hacer coincidir el resultado de GetFrame (0) .GetMethod() – Kyte