Il faudrait alors énumérer toutes les classes de tous les assemblages chargés dans le domaine d'application actuel. Pour ce faire, il faut appeler la fonction GetAssemblies
méthode sur le AppDomain
pour le domaine d'application actuel.
De là, vous appelez GetExportedTypes
(si vous ne voulez que des types publics) ou GetTypes
sur chaque Assembly
pour obtenir les types qui sont contenus dans l'assemblage.
Ensuite, vous appelez le GetCustomAttributes
méthode d'extension sur chaque Type
en passant le type de l'attribut que vous souhaitez trouver.
Vous pouvez utiliser LINQ pour vous simplifier la tâche :
var typesWithMyAttribute =
from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
let attributes = t.GetCustomAttributes(typeof(HelpAttribute), true)
where attributes != null && attributes.Length > 0
select new { Type = t, Attributes = attributes.Cast<HelpAttribute>() };
La requête ci-dessus vous permettra d'obtenir chaque type auquel votre attribut a été appliqué, ainsi que l'instance du ou des attributs qui lui ont été assignés.
Notez que si vous avez un grand nombre d'assemblages chargés dans votre domaine d'application, cette opération peut être coûteuse. Vous pouvez utiliser LINQ parallèle pour réduire la durée de l'opération (au prix de cycles CPU), comme suit :
var typesWithMyAttribute =
// Note the AsParallel here, this will parallelize everything after.
from a in AppDomain.CurrentDomain.GetAssemblies().AsParallel()
from t in a.GetTypes()
let attributes = t.GetCustomAttributes(typeof(HelpAttribute), true)
where attributes != null && attributes.Length > 0
select new { Type = t, Attributes = attributes.Cast<HelpAttribute>() };
Le filtrer sur une base spécifique Assembly
est simple :
Assembly assembly = ...;
var typesWithMyAttribute =
from t in assembly.GetTypes()
let attributes = t.GetCustomAttributes(typeof(HelpAttribute), true)
where attributes != null && attributes.Length > 0
select new { Type = t, Attributes = attributes.Cast<HelpAttribute>() };
Et si l'assemblage contient un grand nombre de types, vous pouvez à nouveau utiliser Parallel LINQ :
Assembly assembly = ...;
var typesWithMyAttribute =
// Partition on the type list initially.
from t in assembly.GetTypes().AsParallel()
let attributes = t.GetCustomAttributes(typeof(HelpAttribute), true)
where attributes != null && attributes.Length > 0
select new { Type = t, Attributes = attributes.Cast<HelpAttribute>() };