Pour un objet, puis-je obtenir toutes ses sous-classes en utilisant la réflexion ?
Réponses
Trop de publicités?Vous pouvez charger tous les types dans l'Assemblée et ensuite les énumérer pour voir lesquels implémentent le type de votre objet. Vous avez dit "objet", donc l'exemple de code ci-dessous ne concerne pas les interfaces. De plus, cet exemple de code ne recherche que dans la même assemblée que celle dans laquelle l'objet a été déclaré.
class A
{}
...
typeof(A).Assembly.GetTypes().Where(type => type.IsSubclassOf(typeof(A)));
Ou, comme suggéré dans les commentaires, utilisez cet exemple de code pour rechercher dans tous les assemblages chargés.
var subclasses =
from assembly in AppDomain.CurrentDomain.GetAssemblies()
from type in assembly.GetTypes()
where type.IsSubclassOf(typeof(A))
select type
Les deux exemples de code vous demandent d'ajouter using System.Linq;
Pour obtenir des sous-classes :
foreach(var asm in AppDomain.CurrentDomain.GetAssemblies())
{
foreach (var type in asm.GetTypes())
{
if (type.BaseType == this.GetType())
yield return type;
}
}
Et faites-le pour tous les assemblages chargés
Vous pouvez également obtenir des interfaces :
this.GetType().GetInterfaces()
Et pour faire l'inverse (obtenir la classe de base), C# ne peut avoir qu'une seule classe de base.