Nah, Anda harus menghitung melalui semua kelas di semua majelis yang dimuat ke domain aplikasi saat ini. Untuk melakukan itu, Anda akan memanggil GetAssemblies
metode pada AppDomain
contoh untuk domain aplikasi saat ini.
Dari sana, Anda akan menelepon GetExportedTypes
(jika Anda hanya ingin tipe publik) atau GetTypes
masing Assembly
- masing untuk mendapatkan tipe yang terkandung dalam majelis.
Kemudian, Anda akan memanggil GetCustomAttributes
metode ekstensi pada setiap Type
instance, melewati tipe atribut yang ingin Anda temukan.
Anda dapat menggunakan LINQ untuk menyederhanakan ini untuk Anda:
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>() };
Kueri di atas akan memberi Anda setiap jenis dengan atribut yang diterapkan padanya, bersama dengan instance atribut yang ditugaskan padanya.
Perhatikan bahwa jika Anda memiliki banyak rakitan yang dimuat ke domain aplikasi Anda, operasi itu bisa mahal. Anda dapat menggunakan LINQ Paralel untuk mengurangi waktu operasi, seperti:
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>() };
Memfilternya pada spesifik Assembly
adalah sederhana:
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>() };
Dan jika perakitan memiliki sejumlah besar jenis di dalamnya, maka Anda dapat menggunakan LINQ paralel:
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>() };