2009-08-12 15 views

risposta

127

Qualcosa di simile:

public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType) 
{ 
    return assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t)); 
} 

Se è necessario gestire farmaci generici, che diventa un po 'più complicato (per esempio passando nella List<> tipo aperto, ma in attesa di tornare un tipo che deriva da List<int>). Altrimenti è semplice però :)

Se si desidera escludere il tipo di per sé, si può farlo abbastanza facilmente:

public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType) 
{ 
    return assembly.GetTypes().Where(t => t != baseType && 
              baseType.IsAssignableFrom(t)); 
} 

Si noti che questo permetterà anche di specificare un'interfaccia e trovare tutti i tipi, che implementarlo, piuttosto che lavorare solo con le classi come fa Type.IsSubclassOf.

+2

Grazie! Ho finito per usare questo Grazie - ho finito per usare questo elenco statico pubblico GetAllSubclassesOf (tipo BaseType) { ritorno Assembly.GetAssembly (BaseType) .GetTypes(). Dove (type => type.IsSubclassOf (baseType)). ToList(); } – aceinthehole

+0

@Downvoter: cura di commentare? –

+0

@Downvoter qui. Il mio commento è scomparso. Come indicato da un pozzo, la risposta è errata. Ho aggiunto la risposta corretta in quanto ho perso il commento di assi fino a quando ho scoperto che il codice non funzionava. Buon Natale. –

1

È necessario enumerare tutti i tipi e controllare per ciascuno se eredita quello che si sta cercando.

Alcuni codici come quello di this question potrebbero essere utili per l'utente.

22

Il metodo seguente otterrà una raccolta di tipi che ereditano un tipo.

C#

public IEnumerable<Type> FindSubClassesOf<TBaseType>() 
{ 
    var baseType = typeof(TBaseType); 
    var assembly = baseType.Assembly; 

    return assembly.GetTypes().Where(t => t.IsSubclassOf(baseType)); 
} 

VB.NET

Public Function FindSubClasses(Of TBaseType)() As IEnumerable(Of Type) 

    Dim baseType = GetType(TBaseType) 
    Dim assembly = baseType.Assembly 

    Return From t In assembly.GetTypes() 
      Where t.IsSubClassOf(baseType) 
      Select t 

End Function 

Se è necessario includere i tipi che implementano un'interfaccia vedere la risposta di @ Jon Skeet.

0

considerare l'utilizzo di questo metodo (scritto per un PCL):

public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType) 
{ 
     TypeInfo baseTypeInfo = baseType.GetTypeInfo(); 
     bool isClass = baseTypeInfo.IsClass, isInterface = baseTypeInfo.IsInterface; 

     return 
      from type in assembly.DefinedTypes 
      where isClass ? type.IsSubclassOf(baseType) : 
        isInterface ? type.ImplementedInterfaces.Contains(baseTypeInfo.AsType()) : false 
      select type.AsType(); 
} 
Problemi correlati