2010-12-02 24 views
24

Je suit:Comment vérifier ce type est hérité d'une certaine interface de C#

Assembly asm = Assembly.GetAssembly(this.GetType()); 

foreach (Type type in asm.GetTypes()) 
{ 
    MyAttribute attr = Attribute.GetCustomAttribute(type, typeof(MyAttribute)) as MyAttribute; 
    if(attr != null && [type is inherited from Iinterface]) 
    { 
     ... 
    } 

} 

Comment puis-je vérifier ce type est héritée de MyInterface? Est-ce que le travail clé fonctionnera de cette manière?

Merci.

Répondre

42

Non, is ne fonctionne que pour vérifier le type d'un objet , pas pour un Type donné. Vous voulez Type.IsAssignableFrom:

if (attr != null && typeof(IInterface).IsAssignableFrom(type)) 

Notez la commande ici. Je trouve que j'ai presque toujours utiliser typeof(...) comme cible de l'appel. Fondamentalement, pour qu'il retourne true, la cible doit être de type "parent" et l'argument doit être de type "enfant".

2

Salut Vous pouvez utiliser type.GetInterfaces() or type.GetInterface() pour obtenir les interfaces que le type implémente.

0

Dans le pire des cas;

si vous utilisez la réflexion sur toutes les propriétés dans une classe ...

public List<PropertyInfo> FindProperties(Type TargetType) { 

    MemberInfo[] _FoundProperties = TargetType.FindMembers(MemberTypes.Property,   
    BindingFlags.Instance | BindingFlags.Public, new 
    MemberFilter(MemberFilterReturnTrue), TargetType); 

    List<PropertyInfo> _MatchingProperties = new List<PropertyInfo>(); 

    foreach (MemberInfo _FoundMember in _FoundProperties) { 
    _MatchingProperties.Add((PropertyInfo)_FoundMember); } 

    return _MatchingProperties; 

} 

IInterface est une interface générique

public void doSomthingToAllPropertiesInDerivedClassThatImplementIInterface() { 

     IList<PropertyInfo> _Properties = FindProperties(this.GetType()); 
     foreach (PropertyInfo _Property in _Properties) 
     { 

      if (_Property.PropertyType.GetInterfaces().Contains(typeof(IInterface))) 
      { 
       if ((IInterface)_Property.GetValue(this, null) != null) 
       { 
         ((IInterface)_Property.GetValue(this, null)).SomeIInterfaceMethod(); 
       } 
      } 
     } 
    }