Pour un objet, puis-je obtenir toutes ses sous-classes par réflexion?
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;
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