Maison >développement back-end >C++ >Comment puis-je trouver efficacement tous les types dérivés d'un type donné à l'aide de la réflexion ?

Comment puis-je trouver efficacement tous les types dérivés d'un type donné à l'aide de la réflexion ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-03 18:36:39878parcourir

How Can I Efficiently Find All Derived Types of a Given Type Using Reflection?

Trouver les types dérivés d'un type

Dans de nombreux cas, il est nécessaire de déterminer les types dérivés d'un type donné. Cependant, les approches par défaut, telles que parcourir tous les types dans les assemblys chargés et vérifier leur assignabilité, peuvent s'avérer inefficaces.

Utiliser Reflection

Une solution plus performante consiste à utiliser réflexion pour récupérer les types dérivés. Voici une approche basée sur LINQ :

var listOfDerivedTypes = (
    from domainAssembly in AppDomain.CurrentDomain.GetAssemblies()
    from assemblyType in domainAssembly.GetTypes()
    where type.IsAssignableFrom(assemblyType)
    select assemblyType).ToArray();

Cette méthode parcourt tous les assemblys et vérifie si le type donné est attribuable à chaque type d'assembly.

Version fluide

Pour une meilleure lisibilité, vous pouvez utiliser un langage courant version :

var listOfDerivedTypes = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(domainAssembly => domainAssembly.GetTypes())
    .Where(assemblyType => type.IsAssignableFrom(assemblyType))
    .ToArray();

Considérations

  • Reflection Overhead : Chaque invocation des méthodes de réflexion entraîne une surcharge. Pour les opérations répétitives, envisagez de charger les types une fois et d'utiliser un mécanisme de mise en cache, tel que Lazy.
  • Types exportés : Pour récupérer uniquement les types visibles publiquement, envisagez d'utiliser domainAssembly.GetExportedTypes() au lieu de domainAssembly.GetTypes().
  • Inclusion du type de base : Par défaut, le la liste renvoyée inclura le type de base. Pour l'exclure, utilisez la condition supplémentaire suivante : && assemblyType != typeof(baseType).
  • Classes abstraites : Si vous souhaitez uniquement des classes dérivées concrètes, ajoutez la condition : && !assemblyType. IsAbstract.
  • Types génériques : La gestion des types génériques nécessite des techniques spécifiques, qui ne sont pas abordées dans ce document. réponse. Reportez-vous aux liens fournis pour plus d'informations.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn