web-dev-qa-db-fra.com

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 par réflexion?

51
Adam Lee

Vous pouvez charger tous les types dans l'assembly, puis les énumérer pour voir ceux qui implémentent le type de votre objet. Vous avez dit "objet", donc l'exemple de code ci-dessous n'est pas pour les interfaces. En outre, cet exemple de code recherche uniquement dans le même assembly que l'objet a été déclaré dans.

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 assemblys 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 nécessitent que vous ajoutiez using System.Linq;

72
mtijn

Sous-classes signifiant interfaces? Oui:

this.GetType().GetInterfaces()

Sous-classes signifiant types de base? Eh bien, c # ne peut avoir qu'une seule classe de base

Sous-classes signifiant toutes les classes qui héritent de votre classe? Oui:

EDIT: (merci vcsjones)

foreach(var asm in AppDomain.CurrentDomain.GetAssemblies())
{
        foreach (var type in asm.GetTypes())
        {
            if (type.BaseType == this.GetType())
                yield return type;
        }
}

Et faites cela pour tous les assemblages chargés

9
joe_coolish