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 Fooimplementa 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.GetGenericTypeDefinitionsi 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 siTno 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);