59 votes

Rechercher des types dans tous les assemblages

Je dois rechercher des types spécifiques dans tous les assemblages d'un site Web ou d'une application Windows. Existe-t-il un moyen simple de le faire? Comme par exemple, la fabrique de contrôleurs pour ASP.NET MVC recherche tous les assemblys pour les contrôleurs.

Merci.

99voto

Ondrej Tucny Points 13127

Il y a deux étapes pour y parvenir:

  • L' AppDomain.CurrentDomain.GetAssemblies() vous donne toutes les assemblées chargées dans le domaine d'application actuel.
  • L' Assembly classe fournit un GetTypes() méthode pour récupérer tous les types au sein de cette assemblée.

Par conséquent, votre code pourrait ressembler à ceci:

foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
{
    foreach (Type t in a.GetTypes())
    {
        // ... do something with 't' ...
    }
}

Pour chercher des types spécifiques (par exemple, la mise en œuvre d'une interface donnée, l'héritage d'un ancêtre commun ou quoi que ce soit), vous aurez pour filtrer les résultats. Dans le cas où vous avez besoin de le faire à plusieurs endroits dans votre application, il est une bonne idée de construire une classe d'assistance offrant différentes options. Par exemple, j'ai souvent appliquée préfixe d'espace de noms filtres, interface de mise en œuvre de filtres, et de la succession de filtres.

Pour obtenir une documentation détaillée regarder dans MSDN ici et ici.

29voto

Thomas Levesque Points 141081

Facile à utiliser Linq:

 IEnumerable<Type> types =
            from a in AppDomain.CurrentDomain.GetAssemblies()
            from t in a.GetTypes()
            select t;

foreach(Type t in types)
{
    ...
}
 

29voto

mheyman Points 795

Solution LINQ avec vérification pour voir si l'assemblage est dynamique:

 /// <summary>
/// Looks in all loaded assemblies for the given type.
/// </summary>
/// <param name="fullName">
/// The full name of the type.
/// </param>
/// <returns>
/// The <see cref="Type"/> found; null if not found.
/// </returns>
private static Type FindType(string fullName)
{
    return
        AppDomain.CurrentDomain.GetAssemblies()
            .Where(a => !a.IsDynamic)
            .SelectMany(a => a.GetTypes())
            .FirstOrDefault(t => t.FullName.Equals(fullName));
}
 

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