Ну, вам придется перечислять все классы во всех сборках, которые загружены в текущий домен приложения. Для этого необходимо вызвать 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>() };