Есть ли способ определить, построен ли универсальный тип из определенного определения универсального типа?
У меня есть общий метод:
Func<IEnumerable<T>, bool> CreateFunction<T>()
гдеT
может быть любым количеством разных типов. Этот метод делает кучу вещей, используя отражение и, еслиT
являетсяIDictionary
независимо от словаряTKey
а такжеTValue
Мне нужно выполнить словарь конкретного кода.
Таким образом, метод может быть вызван:
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>>();
и т.п.
Уточнение по @ ответу Энди
В конечном итоге я хочу знать, еслиT
наследует от / ImplementsIDictionary
даже еслиT
сам по себеDictionary
или какой-то другой тип, который происходит от этого интерфейса.
if(typeof(T) == typeof(IDictionary<,>)
не работает, потому чтоT
является универсальным типом, а не определением универсального типа.
И не знаяTKey
а такжеTValue
(которые не известны во время компиляции) Я не могу сделать сравнение с каким-либо конкретным типом, о котором я знал бы до времени выполнения.
Единственное, что я придумал, - это посмотреть на имя типа или проверить его метод с отражением, найти методы, которые заставили бы меня поверить, что это словарь (то есть искатьContainsKey
а такжеget_Item
).
Есть ли простой способ сделать такое определение?