Nun, Sie müssten alle Klassen in allen Assemblys auflisten, die in die aktuelle App-Domäne geladen werden. Dazu rufen Sie die GetAssembliesMethode auf der AppDomainInstanz für die aktuelle App-Domäne auf.
Von dort aus würden Sie GetExportedTypes(wenn Sie nur öffentliche Typen möchten) oder GetTypesauf jedem Assemblydie Typen aufrufen , die in der Assembly enthalten sind.
Anschließend rufen Sie die GetCustomAttributesErweiterungsmethode für jede TypeInstanz 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 Assemblyist 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>() };