Cóż, należałoby wyliczyć wszystkie klasy we wszystkich zestawach, które są ładowane do bieżącej domeny aplikacji. Aby to zrobić, należy wywołać GetAssemblies
metodę w AppDomain
instancji dla bieżącej domeny aplikacji.
Stamtąd można wywołać GetExportedTypes
(jeśli chcesz tylko typy publiczne) lub GetTypes
na każdym Assembly
z nich, aby uzyskać typy zawarte w zestawie.
Następnie możesz wywołać GetCustomAttributes
metodę rozszerzenia dla każdej Type
instancji, przekazując typ atrybutu, który chcesz znaleźć.
Możesz użyć LINQ, aby uprościć to dla siebie:
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>() };
Powyższe zapytanie dostarczy Ci każdy typ z zastosowanym do niego atrybutem, wraz z wystąpieniem przypisanego (-ych) atrybutu (-ów).
Zwróć uwagę, że jeśli masz dużą liczbę zestawów załadowanych do domeny aplikacji, ta operacja może być kosztowna. Możesz użyć Parallel LINQ, aby skrócić czas operacji, na przykład:
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>() };
Filtrowanie według konkretnego Assembly
jest proste:
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>() };
A jeśli zestaw zawiera dużą liczbę typów, możesz ponownie użyć 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>() };