Suponga las siguientes definiciones de tipo:
public interface IFoo<T> : IBar<T> {}
public class Foo<T> : IFoo<T> {}
¿Cómo puedo saber si el tipo Foo
implementa la interfaz genérica IBar<T>
cuando solo está disponible el tipo destrozado?
c#
.net
reflection
sduplooy
fuente
fuente
typeof(IBar<,,,>)
con comas que actúan como marcadores de posiciónDebe subir por el árbol de herencia y encontrar todas las interfaces para cada clase en el árbol, y comparar
typeof(IBar<>)
con el resultado de llamarType.GetGenericTypeDefinition
si la interfaz es genérica. Todo es un poco doloroso, ciertamente.Vea esta respuesta y estas para obtener más información y código.
fuente
fuente
Como una extensión de método auxiliar
Ejemplo de uso:
fuente
Estoy usando una versión un poco más simple del método de extensión @GenericProgrammers:
Uso:
fuente
Debe verificar con un tipo construido de la interfaz genérica.
Tendrás que hacer algo como esto:
porque
IBar<String>
representa ese tipo construido. La razón por la que tiene que hacer esto es porque siT
no está definido en su verificación, el compilador no sabe si quiere decirIBar<Int32>
o noIBar<SomethingElse>
.fuente
Para abordar el sistema de tipo completo, creo que es necesario para la recursividad mango, por ejemplo
IList<T>
:ICollection<T>
:IEnumerable<T>
, sin la cual no sabría queIList<int>
en última instancia los implementosIEnumerable<>
.fuente
En primer lugar,
public class Foo : IFoo<T> {}
no se compila porque necesita especificar una clase en lugar de T, pero suponiendo que haga algo comopublic class Foo : IFoo<SomeClass> {}
entonces si lo haces
fuente
En caso de que quisieras un método de extensión que admitiera tipos básicos genéricos, así como interfaces, he ampliado la respuesta de sduploy:
fuente
Método para verificar si el tipo hereda o implementa un tipo genérico:
fuente
Prueba la siguiente extensión.
Para probarlo. crear
y el método de prueba
fuente
No debería haber nada malo en lo siguiente:
Para obtener crédito adicional, puede atrapar AmbiguousMatchException si desea proporcionar un parámetro de tipo genérico específico con su consulta IBar.
fuente
bool implementsGeneric = (anObject.Implements(typeof(IBar<>).Name) != null);