Hay un montón de preguntas sobre este tema, pero tengo una versión ligeramente modificada.Determinar si una clase implementa una interfaz muy específica
tenemos el siguiente código:
interface IFoo { }
interface IBar : IFoo { }
class Foo : IFoo { }
class Bar : IBar { }
bool Implements_IFoo(Type type) { /* ??? */ }
Ahora, el giro de la historia: el método Implements_IFoo
sólo debe devolver verdadero cuando el tipo implementa IFoo solamente y no cualquiera de las interfaces derivadas de IFoo. Para ilustrar aquí hay algunos ejemplos de este método:
Implements_IFoo(typeof(Foo)); // Should return true
Implements_IFoo(typeof(Bar)); // Should return false as Bar type
// implements an interface derived from IFoo
Tenga en cuenta que no puede haber numerosas interfaces derivadas de IFoo y que no necesariamente saber de su existencia.
El método obvio es encontrar todas las interfaces derivadas de IFoo a través de la reflexión y luego simplemente verificar el tipo de (Bar) .GetInterfaces() es cualquiera de los que están presentes allí. Pero me preguntaba si alguien puede encontrar una solución más elegante.
PD La pregunta proviene de algún código que encontré que utiliza esta verificación en las clases (if(obj.GetType() == typeof(BaseClass)) { ... }
). Estamos reemplazando clases con interfaces ahora ese código en particular. Además, por las dudas, estoy implementando esta verificación como una bandera booleana, por lo que esta pregunta es puramente hipotética.
Tengo mucha curiosidad de por qué necesitas este tipo de introspección en primer lugar. Es probable que su diseño sea incorrecto. – tdammers
Lea la pregunta 'hasta el final antes de comentar la próxima vez: ya expliqué que esta es una pregunta hipotética;) – Jefim