90 votes

Comment trouver tous les types dans un assembly qui hérite d'un type spécifique C #

Comment obtenir une collection de tous les types hérités d'un autre type spécifique?

147voto

Jon Skeet Points 692016

Quelque chose comme:

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

Si vous devez gérer des génériques, qui devient un peu plus compliqué (par exemple: passage à l'open List<> type mais s'attendent à obtenir un type qui dérive d' List<int>). Sinon, c'est simple :)

Si vous souhaitez exclure le type lui-même, vous pouvez le faire assez facilement:

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

Notez que cela vous permettra également de spécifier une interface et de trouver tous les types qui sont à mettre en œuvre, plutôt que de simplement travailler avec des classes Type.IsSubclassOf .

26voto

Tim Murphy Points 2441

La méthode suivante obtiendra une collection de types qui hériteront d'un type.

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
 

Si vous devez inclure des types qui implémentent une interface, voir la réponse de @Jon Skeet.

1voto

Thomas Danecker Points 3127

Vous devez énumérer tous les types et vérifier si chacun hérite de celui que vous recherchez.

Certains codes comme celui de cette question peuvent vous être utiles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X