Как узнать, когда интерфейс напрямую реализован в типе, игнорирующем унаследованные? - PullRequest
7 голосов
/ 23 октября 2009

Проблема возникает, когда у меня есть класс, реализующий интерфейс и расширяющий класс, который реализует интерфейс:

class Some : SomeBase, ISome {}
class SomeBase : ISomeBase {}
interface ISome{}
interface ISomeBase{}

Поскольку typeof (Some) .GetInterfaces () возвращает массив с ISome и ISomeBase, я не могу различить, реализован или унаследован ISome (как ISomeBase) Как MSDN я не могу принять порядок интерфейсов в массиве, поэтому я потерян. Метод typeof (Some) .GetInterfaceMap () также не различает их.

1 Ответ

9 голосов
/ 23 октября 2009

Вам просто нужно исключить интерфейсы, реализованные базовым типом:

public static class TypeExtensions
{
    public static IEnumerable<Type> GetInterfaces(this Type type, bool includeInherited)
    {
        if (includeInherited || type.BaseType == null)
            return type.GetInterfaces();
        else
            return type.GetInterfaces().Except(type.BaseType.GetInterfaces());
    }
}

...


foreach(Type ifc in typeof(Some).GetInterfaces(false))
{
    Console.WriteLine(ifc);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...