В этой теме много вопросов, но у меня есть слегка измененная версия.
У нас есть следующий код:
interface IFoo { }
interface IBar : IFoo { }
class Foo : IFoo { }
class Bar : IBar { }
bool Implements_IFoo(Type type) { /* ??? */ }
Теперь, поворот истории: метод Implements_IFoo
должен возвращать true только тогда, когда Type реализует только IFoo, а не какие-либо интерфейсы, полученные из IFoo. Для иллюстрации здесь приведены некоторые примеры этого метода:
Implements_IFoo(typeof(Foo)); // Should return true
Implements_IFoo(typeof(Bar)); // Should return false as Bar type
// implements an interface derived from IFoo
Обратите внимание, что могут быть многочисленные интерфейсы, полученные из IFoo, и вы не обязательно знаете об их существовании.
Очевидным методом является поиск всех интерфейсов, полученных из IFoo через отражение, а затем просто проверка типа (Bar).GetInterfaces() - это любой из них. Но мне было интересно, может ли кто-нибудь придумать более элегантное решение.
PS Вопрос возникает из некоторого кода, который я нашел, который использует эту проверку для классов (if(obj.GetType() == typeof(BaseClass)) { ... }
). Мы заменяем классы интерфейсами теперь, что конкретный код. Кроме того, на всякий случай - я выполняю эту проверку как булевский флаг, поэтому этот вопрос является чисто гипотетическим.