Ну, вам придется перечислять все классы во всех сборках, которые загружены в текущий домен приложения. Для этого необходимо вызвать метод GetAssemblies
в экземпляре AppDomain
для текущего домена приложения.
Оттуда вы бы позвонили GetExportedTypes
(если вы хотите только публичные типы) или GetTypes
на каждом Assembly
, чтобы получить типы, содержащиеся в сборке.
Затем вы вызываете метод GetCustomAttributes
для каждого экземпляра Type
, передавая тип атрибута, который вы хотите найти.
Вы можете использовать LINQ, чтобы упростить это для вас:
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>() };
Приведенный выше запрос даст вам каждый тип с примененным к нему атрибутом, а также экземпляр присвоенного ему атрибута (ов).
Обратите внимание, что если в домен приложения загружено большое количество сборок, эта операция может быть дорогостоящей. Вы можете использовать Parallel LINQ для сокращения времени выполнения операции, например:
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>() };
Фильтрация по определенному Assembly
проста:
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>() };
И если в сборке много типов, вы можете снова использовать 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>() };