Suponha as seguintes definições de tipo:
public interface IFoo<T> : IBar<T> {}
public class Foo<T> : IFoo<T> {}
Como descobrir se o tipo Foo
implementa a interface genérica IBar<T>
quando apenas o tipo desconfigurado está disponível?
c#
.net
reflection
sduplooy
fonte
fonte
typeof(IBar<,,,>)
com vírgulas agindo como espaços reservadosVocê precisa percorrer a árvore de herança e encontrar todas as interfaces para cada classe na árvore e comparar
typeof(IBar<>)
com o resultado da chamadaType.GetGenericTypeDefinition
se a interface for genérica. É tudo um pouco doloroso, certamente.Veja esta resposta e estas para obter mais informações e código.
fonte
fonte
Como extensão do método auxiliar
Exemplo de uso:
fonte
Estou usando uma versão um pouco mais simples do método de extensão @GenericProgrammers:
Uso:
fonte
Você deve verificar com um tipo construído da interface genérica.
Você terá que fazer algo assim:
porque
IBar<String>
representa esse tipo construído. A razão pela qual você deve fazer isso é porque, seT
estiver indefinido em sua verificação, o compilador não sabe se você quer dizerIBar<Int32>
ouIBar<SomethingElse>
.fonte
Para enfrentar o sistema de tipos completamente, eu acho que você precisa recursão pega, por exemplo
IList<T>
:ICollection<T>
:IEnumerable<T>
, sem a qual você não saberia queIList<int>
, finalmente, implementosIEnumerable<>
.fonte
Antes de tudo
public class Foo : IFoo<T> {}
, não compila porque você precisa especificar uma classe em vez de T, mas supondo que você faça algo comopublic class Foo : IFoo<SomeClass> {}
então se você faz
fonte
Caso você queira um método de extensão que suporte tipos de bases genéricos e interfaces, eu expandi a resposta do sduplooy:
fonte
Método para verificar se o tipo herda ou implementa um tipo genérico:
fonte
Tente a seguinte extensão.
Para testá-lo. crio
e o método de teste
fonte
Não deve haver nada de errado no seguinte:
Para obter crédito extra, você pode capturar AmbiguousMatchException se desejar fornecer um parâmetro de tipo genérico específico com sua consulta IBar.
fonte
bool implementsGeneric = (anObject.Implements(typeof(IBar<>).Name) != null);