2012-06-05 7 views
6

Я хочу протестировать объект, чтобы увидеть, реализует ли он IDictionary<TKey,TValue>, но мне все равно, что TKey и TValue.Проверьте, реализует ли объект общий интерфейс для любого типа типа

я могу проверить, если это конкретный экземпляр структуры Dictionary<,> как это:

bool isDict = type.IsGenericType && 
    (typeof(Dictionary<,>).IsAssignableFrom(type.GetGenericTypeDefinition()); 

, но я не могу придумать способ, чтобы проверить что-то, что реализует IDictionary<,>. Этот метод не работает для интерфейса; IsAssignableFrom return false, если я тестирую базовый тип IDictionary<,>, что кажется странным, поскольку оно работает для конкретного типа.

Обычно вы должны использовать is, чтобы проверить, что-то реализует интерфейс, но, конечно, это работает только в том случае, если я хочу протестировать определенный общий интерфейс. Или я просто проверил бы общий интерфейс предков, но в отличие от других общих структур данных, таких как IList<> и ICollection<>, нет уникального не общего интерфейса, из которого наследуется общий IDictionary<TKey,TValue>.

ответ

10

Как о чем-то вроде

return type.GetInterfaces() 
      .Where(t => t.IsGenericType) 
      .Select(t => t.GetGenericTypeDefinition()) 
      .Any(t => t.Equals(typeof(IDictionary<,>))); 

, который я уверен, что вы можете легко обобщить для любого обобщенного определения типа.

+1

Вроде. Как я пропустил GetInterfaces? –