65 votes

Pour un objet, puis-je obtenir toutes ses sous-classes en utilisant la réflexion ou d'autres moyens ?

Pour un objet, puis-je obtenir toutes ses sous-classes en utilisant la réflexion ?

92voto

mtijn Points 2036

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;

5voto

joe_coolish Points 3220

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.

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