Eh bien, vous devrez énumérer toutes les classes de tous les assemblys chargés dans le domaine d'application actuel. Pour ce faire, vous appelleriez la GetAssemblies
méthode sur l' AppDomain
instance pour le domaine d'application actuel.
À partir de là, vous appelleriez GetExportedTypes
(si vous ne voulez que des types publics) ou GetTypes
sur chacun Assembly
d' eux pour obtenir les types contenus dans l'assembly.
Ensuite, vous appelleriez la GetCustomAttributes
méthode d'extension sur chaque Type
instance, en passant le type de l'attribut que vous souhaitez trouver.
Vous pouvez utiliser LINQ pour simplifier cela pour vous:
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 obtiendra chaque type avec votre attribut appliqué, ainsi que l'instance du ou des attributs qui lui sont attribués.
Notez que si vous avez un grand nombre d'assemblys chargés dans votre domaine d'application, cette opération peut être coûteuse. Vous pouvez utiliser Parallel LINQ pour réduire la durée de l'opération, comme ceci:
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 un 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'assembly 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>() };