Bene, dovresti enumerare tutte le classi in tutti gli assembly caricati nel dominio dell'app corrente. Per fare questo, è necessario chiamare il GetAssemblies
metodo sulla AppDomain
istanza per il dominio applicazione corrente.
Da lì, chiameresti GetExportedTypes
(se vuoi solo tipi pubblici) o GetTypes
su ciascuno Assembly
per ottenere i tipi contenuti nell'assembly.
Quindi, chiameresti il GetCustomAttributes
metodo di estensione su ogni Type
istanza, passando il tipo di attributo che desideri trovare.
Puoi usare LINQ per semplificare questo per te:
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 query sopra ti darà ogni tipo con il tuo attributo applicato ad esso, insieme all'istanza degli attributi assegnati ad esso.
Se si dispone di un numero elevato di assembly caricati nel dominio dell'applicazione, tale operazione potrebbe essere costosa. È possibile utilizzare Parallel LINQ per ridurre il tempo dell'operazione, in questo modo:
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>() };
Filtrarlo su uno specifico Assembly
è semplice:
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>() };
E se l'assembly contiene un gran numero di tipi, è possibile utilizzare nuovamente 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>() };