Nun, Sie müssten alle Klassen in allen Assemblys auflisten, die in die aktuelle App-Domäne geladen werden. Um dies zu tun, würden Sie die GetAssemblies
method auf der AppDomain
Instanz für die aktuelle App-Domäne aufrufen.
Von dort würden Sie GetExportedTypes
aufrufen (wenn Sie nur öffentliche Typen wollen) oder GetTypes
auf jedem Assembly
, um die Typen zu erhalten, die in der Baugruppe enthalten sind.
Dann würden Sie die GetCustomAttributes
method auf jeder Type
Instanz aufrufen und den Typ des gewünschten Attributs übergeben.
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>() };
Die obige Abfrage Sie jede Art erhalten wird mit Ihrem Attribut angewendet wurde, zusammen mit der Instanz des Attributs (n) zugeordnet.
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 Zeit der Operation zu reduzieren, etwa so:
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>() };
Filtern sie auf 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>() };
Und wenn die Baugruppe verfügt über eine große Anzahl von Arten in ihm , dann können Sie wieder parallel LINQ verwenden:
MSDN Beispiel Link ist eine tote Verbindung. – MadTigger