У меня есть общий метод:
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
).
Есть ли прямолинейностьПервый способ сделать такое определение?