2009-10-23 13 views
6

Appare il problema è quando ho una classe che implementa un'interfaccia, ed estendendo una classe che implementa un'interfaccia:Come faccio a sapere quando un'interfaccia viene implementata direttamente in un tipo ignorando quelli ereditati?

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

Da typeof (Alcune) .GetInterfaces() resi e matrice con ISome e ISomeBase, i' Non sono in grado di distinguere se ISome è implementato o ereditato (come ISomeBase). Come MSDN non posso assumere l'ordine delle interfacce nell'array, quindi sono perso. Il metodo typeof (Some) .GetInterfaceMap() non li distingue neanche.

+1

Perché ti interessa? Cosa stai cercando di fare? –

+1

È lungo spiegare, ma voglio registrare automaticamente i servizi in AutoFac in base alla loro implementazione dell'interfaccia, poiché i servizi possono essere estesi, ho bisogno di fare una distinzione. –

risposta

8

Hai solo bisogno di escludere le interfacce implementate dal tipo di base:

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