คุณจะต้องระบุคลาสทั้งหมดในชุดประกอบทั้งหมดที่โหลดลงในโดเมนแอปปัจจุบัน ในการทำเช่นนั้นคุณจะต้องเรียกใช้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>() };