¿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?

Respuestas a la pregunta(0)

Su respuesta a la pregunta