Chà, bạn sẽ phải liệt kê tất cả các lớp trong tất cả các hội đồng được tải vào miền ứng dụng hiện tại. Để làm điều đó, bạn sẽ gọi GetAssemblies
phương thức trên AppDomain
ví dụ cho miền ứng dụng hiện tại.
Từ đó, bạn sẽ gọi GetExportedTypes
(nếu bạn chỉ muốn các loại công khai) hoặc GetTypes
trên mỗi loại Assembly
để có được các loại có trong hội đồng.
Sau đó, bạn sẽ gọi GetCustomAttributes
phương thức mở rộng trên mỗi Type
phiên bản, chuyển loại thuộc tính bạn muốn tìm.
Bạn có thể sử dụng LINQ để đơn giản hóa việc này cho bạn:
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>() };
Truy vấn trên sẽ giúp bạn từng loại với thuộc tính của bạn được áp dụng cho nó, cùng với thể hiện của (các) thuộc tính được gán cho nó.
Lưu ý rằng nếu bạn có một số lượng lớn các hội đồng được tải vào miền ứng dụng của bạn, thì thao tác đó có thể tốn kém. Bạn có thể sử dụng Parallel LINQ để giảm thời gian hoạt động, như vậy:
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>() };
Lọc nó trên một cụ thể Assembly
là đơn giản:
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>() };
Và nếu hội đồng có số lượng lớn các loại trong đó, thì bạn có thể sử dụng lại 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>() };