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