34 votes

Recherche de toutes les classes ayant un attribut particulier

J'ai une bibliothèque .NET dans laquelle j'ai besoin de trouver toutes les classes qui ont un attribut personnalisé que j'ai défini sur elles, et je veux être capable de les trouver à la volée quand une application utilise ma bibliothèque (c'est-à-dire que je ne veux pas un fichier de configuration quelque part dans lequel j'indique l'assemblage à regarder et/ou les noms des classes).

Je regardais AppDomain.CurrentDomain mais je n'y suis pas très familier et je ne suis pas sûr de l'étendue des privilèges nécessaires (je veux être capable d'exécuter la bibliothèque dans une application Web avec un minimum de confiance). si possible mais plus la confiance est faible, plus je suis heureux). Je veux aussi garder à l'esprit les performances (il s'agit d'une bibliothèque .NET 3.5, donc LINQ est tout à fait valide !)

Alors, c'est AppDomain.CurrentDomain ma meilleure/seule option, et ensuite faire une boucle à travers tous les assemblages, et ensuite taper dans ces assemblages ? Ou y a-t-il un autre moyen

86voto

Mark Cidade Points 53945
IEnumerable<Type> GetTypesWith<TAttribute>(bool inherit) 
                              where TAttribute: System.Attribute
 { return from a in AppDomain.CurrentDomain.GetAssemblies()
          from t in a.GetTypes()
          where t.IsDefined(typeof(TAttribute),inherit)
          select t;
 }

4voto

Roger Hill Points 935

Mark a posté une bonne réponse, mais voici une version libre de linq si vous la préférez :

    public static IEnumerable<Type> GetTypesWith<TAttribute>(bool inherit) where TAttribute : Attribute
    {
        var output = new List<Type>();

        var assemblies = AppDomain.CurrentDomain.GetAssemblies();

        foreach (var assembly in assemblies)
        {
            var assembly_types = assembly.GetTypes();

            foreach (var type in assembly_types)
            {
                if (type.IsDefined(typeof(TAttribute), inherit))
                    output.Add(type);
            }
        }

        return output;
    }

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