Existe uma maneira de determinar se um tipo genérico é criado a partir de uma definição específica de tipo genérico?
Eu tenho um método genérico:
Func<IEnumerable<T>, bool> CreateFunction<T>()
OndeT
pode haver qualquer número de tipos diferentes. Este método faz um monte de coisas usando reflexão e seT
é umIDictionary
, independentemente do dicionárioTKey
eTValue
Eu preciso executar o código específico do dicionário.
Portanto, o método pode ser chamado:
var f = CreateFunction<string>();
var f0 = CreateFunction<SomePocoType>();
var f1 = CreateFunction<IDictionary<string,object>>();
var f2 = CreateFunction<Dictionary<string,object>>();
var f3 = CreateFunction<SomeDerivedDictionaryType<string,object>>();
etc.
Esclarecimento por resposta de Andy
Em última análise, eu quero saber seT
herda de / implementaIDictionary
mesmo seT
em si éDictionary
ou algum outro tipo que deriva dessa interface.
if(typeof(T) == typeof(IDictionary<,>)
não funciona porqueT
é o tipo genérico, não a definição de tipo genérico.
E sem saberTKey
eTValue
(que não são conhecidas no momento da compilação) Não posso fazer uma comparação com nenhum tipo concreto que eu conheceria até o tempo de execução.
A única coisa que inventei é olhar o nome do tipo ou inspecionar seu método com reflexão, procurando métodos que me levariam a acreditar que é um dicionário (ou seja, procureContainsKey
eget_Item
)
Existe alguma maneira direta de fazer esse tipo de determinação?