Nun, Sie müssten alle Klassen in allen Assemblys auflisten, die in die aktuelle App-Domäne geladen werden. Dazu rufen Sie die GetAssemblies
Methode auf der AppDomain
Instanz für die aktuelle App-Domäne auf.
Von dort aus würden Sie GetExportedTypes
(wenn Sie nur öffentliche Typen möchten) oder GetTypes
auf jedem Assembly
die Typen aufrufen , die in der Assembly enthalten sind.
Anschließend rufen Sie die GetCustomAttributes
Erweiterungsmethode für jede Type
Instanz auf und übergeben den Typ des Attributs, das Sie suchen möchten.
Sie können LINQ verwenden, um dies für Sie zu vereinfachen:
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>() };
Mit der obigen Abfrage erhalten Sie jeden Typ, auf den Ihr Attribut angewendet wurde, sowie die Instanz der ihm zugewiesenen Attribute.
Beachten Sie, dass dieser Vorgang teuer sein kann, wenn Sie eine große Anzahl von Assemblys in Ihre Anwendungsdomäne geladen haben. Sie können Parallel LINQ verwenden , um die Operationszeit wie folgt zu verkürzen:
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>() };
Das Filtern nach einem bestimmten Assembly
ist einfach:
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>() };
Wenn die Assembly eine große Anzahl von Typen enthält, können Sie Parallel LINQ erneut verwenden:
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>() };