¿Hay alguna manera de determinar si un tipo genérico se construye a partir de una definición de tipo genérico específico?
Tengo un método genérico:
Func<IEnumerable<T>, bool> CreateFunction<T>()
dóndeT
puede ser cualquier número de tipos diferentes. Este método hace un montón de cosas usando la reflexión y siT
es unIDictionary
, independientemente del diccionarioTKey
yTValue
Necesito ejecutar el código específico del diccionario.
Entonces el método podría llamarse:
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.
Aclaración según la respuesta de @ Andy
En definitiva quiero saber siT
hereda de / implementaIDictionary
incluso siT
en sí esDictionary
o algún otro tipo que se deriva de esa interfaz.
if(typeof(T) == typeof(IDictionary<,>)
no funciona porqueT
es el tipo genérico, no la definición de tipo genérico.
Y sin saberTKey
yTValue
(que no se conocen en tiempo de compilación) No puedo hacer una comparación con ningún tipo concreto que conozca hasta el tiempo de ejecución.
Lo único que se me ocurre es mirar el nombre del tipo o inspeccionar su método con reflexión, buscar métodos que me lleven a creer que es un diccionario (es decir, buscarContainsKey
yget_Item
)
¿Hay alguna forma directa de hacer este tipo de determinación?