Bem, você teria que enumerar todas as classes em todos os assemblies carregados no domínio do aplicativo atual. Para fazer isso, você chamaria o GetAssemblies
método na AppDomain
instância para o domínio de aplicativo atual.
A partir daí, você chamaria GetExportedTypes
(se quiser apenas tipos públicos) ou GetTypes
em cada um Assembly
para obter os tipos que estão contidos na montagem.
Em seguida, você chamaria o GetCustomAttributes
método de extensão em cada Type
instância, passando o tipo do atributo que deseja encontrar.
Você pode usar o LINQ para simplificar isso para você:
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>() };
A consulta acima fornecerá a você cada tipo com seu atributo aplicado a ela, juntamente com a instância do (s) atributo (s) atribuído (s) a ela.
Observe que, se você tiver um grande número de assemblies carregados no domínio do aplicativo, essa operação poderá ser cara. Você pode usar o LINQ paralelo para reduzir o tempo da operação, assim:
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>() };
Filtrando-o em um específico Assembly
é simples:
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 a montagem tiver um grande número de tipos, você poderá usar o Parallel LINQ novamente:
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>() };