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