Comment obtenir une collection de tous les types hérités d'un autre type spécifique?
Réponses
Trop de publicités?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
.
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.
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.