En primer lugar, el fragmento de MSDN que ha publicado no tiene nada que ver con su pregunta real. Se trata de cuando se tiene, por ejemplo, un tipo genérico como class Foo<T> where T : IEnumerable
, y se intenta llamar GetInterfaces
relativa a la recepción de parámetros T
, por ejemplo a través typeof(Foo<>).GetGenericArguments().Single().GetInterfaces().
En segundo lugar, se especifica un poco mal el problema. Tenga en cuenta que cuando una clase implementa una interfaz, debe implementar todos de las interfaces 'heredadas' por esa interfaz. Es simplemente una característica de conveniencia C# que le permite omitir las interfaces heredadas en la declaración de clase. En su ejemplo, es perfectamente legal (y no es diferente) a explícitamente incluir el 'heredada' GHI
interfaz:
class ABC : DEF, GHI {...}
he asumido que lo que realmente quiere hacer es encontrar un 'mínimo conjunto de interfaces que "cubren" todas las interfaces implementadas del tipo. Esto da como resultado una versión ligeramente simplificada del Set cover problem.
Aquí hay una manera de resolverlo, sin ningún tipo de intento algorítmicamente eficiente. La idea es producir el conjunto de interfaz mínimo filtrando aquellas interfaces que son ya implementadas porotras interfaces implementadas por el tipo.
Type type = ...
var allInterfaces = type.GetInterfaces();
var minimalInterfaces = from iType in allInterfaces
where !allInterfaces.Any(t => t.GetInterfaces()
.Contains(iType))
select iType;
( EDITAR - Aquí hay una manera mejor de hacer lo anterior:
var minimalInterfaces = allInterfaces.Except
(allInterfaces.SelectMany(t => t.GetInterfaces()));
)
Por ejemplo, para List<int>
:
allInterfaces:
System.Collections.Generic.IList`1[System.Int32]
System.Collections.Generic.ICollection`1[System.Int32]
System.Collections.Generic.IEnumerable`1[System.Int32]
System.Collections.IEnumerable
System.Collections.IList
System.Collections.ICollection
minimalInterfaces:
System.Collections.Generic.IList`1[System.Int32]
System.Collections.IList
Tenga en cuenta que esta solución cubre interfaz 'hierarchies' solamente (que es lo que parece querer), no cómo se relacionan con la clase clase jerarquía. En particular, no presta atención a donde en la jerarquía de una clase se implementó por primera vez una interfaz.
Por ejemplo, supongamos que tenemos:
interface IFoo { }
interface IBar : IFoo { }
interface IBaz { }
class Base : IBar { }
class Derived : Base, IBaz { }
Ahora bien, si se intenta utilizar la solución que he descrito para obtener el mínimo establecido para la interfaz de Derived
, se llega a IBaz
, así como IBar
. Si no quiere IBar
, debería esforzarse más: eliminar las interfaces implementadas por las clases base. La forma más sencilla de hacerlo sería eliminar de la interfaz mínima: establecer las interfaces implementadas por la clase base inmediata de la clase, como se menciona en la respuesta de @ MikeEast.
Dado que yo estoy sólo en mi iPad ¡No puedo código de prueba o buscar todos los métodos, pero aquí hay un pensamiento. ¿Podrían encontrar todas las interfaces que implementa su tipo (incluidas las heredadas), luego pasar al tipo base de su tipo, encontrar todas las interfaces * que * escriba implementa y restar aquellas del primer conjunto? Creo que se quedaría con lo que ABC agregó de interfaces. Si alguien quiere "robar" este comentario y escribir una respuesta real, por favor hazlo, no será hasta mañana hasta que regrese a mi computadora. –
GetInterfaces() es un método en la clase Type. –
Ah, mis disculpas, su "tipo de base" es una interfaz, entonces no lo sé. –