Il y a deux étapes pour y parvenir:
- Le
AppDomain.CurrentDomain.GetAssemblies()
vous donne toutes les assemblées chargées dans le domaine d'application actuel.
- La classe
Assembly
fournit une méthode GetTypes()
pour récupérer tous les types dans cet assembly particulier.
D'où votre code pourrait ressembler à ceci:
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
{
foreach (Type t in a.GetTypes())
{
// ... do something with 't' ...
}
}
Pour rechercher des types spécifiques (par exemple, la mise en œuvre d'une interface donnée, héritant d'un ancêtre commun ou autre), vous devrez filtrer-la résultats. Dans le cas où vous auriez besoin de le faire à plusieurs endroits dans votre application, c'est une bonne idée de créer une classe d'aide offrant différentes options. Par exemple, j'ai souvent appliqué des filtres de préfixe d'espace de noms, des filtres d'implémentation d'interface et des filtres d'héritage. Pour une documentation détaillée, consultez MSDN here et here.
Bien sûr, si vous alliez faire un filtrage sur ces types et assemblages, vous utiliseriez LINQ, n'est-ce pas? ;) –
@Niall Connaughton C'est une question de préférence personnelle. –
J'ai trouvé des situations où cela provoquait une exception, parce que mon application générait des assemblages dynamiques, juste un gotcha à connaître. Vous pouvez identifier les assemblages dynamiques et les ignorer comme ceci http://stackoverflow.com/questions/1423733/how-to-tell-if-a-net-assembly-is-dynamic - si cela pose un problème –