Вопрос по reflection, generics, interface, c# – Проверьте, реализует ли объект универсальный интерфейс для любого универсального типа

6

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

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

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

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

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

Ваш Ответ

1   ответ
10

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

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

Подобно. Как я пропустил GetInterfaces? Jamie Treworgy

Похожие вопросы