2009-10-23 5 views
6

pojawia się problem, kiedy to ma klasę wykonania interfejsu, oraz biegnących klasy, które implementuje InterfaceSkąd wiadomo, kiedy interfejs jest bezpośrednio implementowany w typie ignorującym dziedziczone?

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

Ponieważ typeof (niektórych) .GetInterfaces() zwrotów i tablicę z ISome ISomeBase i, i” nie jestem w stanie odróżnić, czy ISome jest zaimplementowane czy odziedziczone (jako ISomeBase). Jako MSDN I nie mogę przyjąć kolejności interfejsów w tablicy, dlatego jestem zagubiony. Metoda typeof (Some) .GetInterfaceMap() również ich nie rozróżnia.

+1

Dlaczego cię to obchodzi? Co próbujesz zrobić? –

+1

Długo trzeba wyjaśniać, ale chcę automatycznie rejestrować usługi w AutoFac na podstawie ich implementacji interfejsu, ponieważ usługi mogą być przedłużone, potrzebuję rozróżnienia. –

Odpowiedz

8

Wystarczy wykluczyć interfejsy realizowane przez Typ podstawy:

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); 
}