2010-07-21 44 views
6

tôi đã tạo ra một thuộc tính tùy chỉnh để trang trí một số lớp học mà tôi muốn truy vấn trong thời gian chạy:thuộc tính thừa kế và Reflection

[AttributeUsage(AttributeTargets.Class, AllowMultiple=false, Inherited=true)] 
public class ExampleAttribute : Attribute 
{ 
    public ExampleAttribute(string name) 
    { 
     this.Name = name; 
    } 

    public string Name 
    { 
     get; 
     private set; 
    } 
} 

Mỗi lớp học có nguồn gốc từ một lớp cơ sở trừu tượng:

[Example("BaseExample")] 
public abstract class ExampleContentControl : UserControl 
{ 
    // class contents here 
} 

public class DerivedControl : ExampleContentControl 
{ 
    // class contents here 
} 

Tôi có cần đặt thuộc tính này trên mỗi lớp dẫn xuất, ngay cả khi tôi thêm nó vào lớp cơ sở? Thuộc tính được đánh dấu là có thể kế thừa, nhưng khi tôi thực hiện truy vấn, tôi chỉ thấy lớp cơ sở chứ không phải các lớp dẫn xuất.

Từ another thread:

var typesWithMyAttribute = 
    from a in AppDomain.CurrentDomain.GetAssemblies() 
    from t in a.GetTypes() 
    let attributes = t.GetCustomAttributes(typeof(ExampleAttribute), true) 
    where attributes != null && attributes.Length > 0 
    select new { Type = t, Attributes = attributes.Cast<ExampleAttribute>() }; 

Cảm ơn, WTS

Trả lời

3

tôi chạy mã của bạn như là, và nhận được kết quả sau:

{ Type = ConsoleApplication2.ExampleContentControl, Attributes = ConsoleApplication2.ExampleAttribute[] } 
{ Type = ConsoleApplication2.DerivedControl, Attributes = ConsoleApplication2.ExampleAttribute[] } 

Vì vậy, nó dường như làm việc ... Bạn chắc chắn cái gì khác không xảy ra?

+0

Thử đặt một lớp dẫn xuất vào một dự án khác, tham khảo dự án đầu tiên. Nếu tôi đặt lớp dẫn xuất trong cùng một không gian tên làm cơ sở, nó sẽ hoạt động. –

+0

Vâng, một nửa đã tìm ra - các hội đồng khác chưa được tải khi truy vấn LINQ được gọi. Tôi đoán câu hỏi sau đó sẽ trở thành, "làm thế nào để tôi nhận được tất cả các hội đồng có liên quan đến thực thi của tôi (tức là tôi phải thay thế các cuộc gọi AppDomain.CurrentDomain.GetAssemblies() với)?" –

+0

Phải, điều đó có ý nghĩa ... bạn cần phải tìm cách nào đó để buộc tải trọng trên tất cả các bộ phận có thể quan trọng. Điều này thực sự phụ thuộc vào cách ứng dụng của bạn được cấu trúc. Nếu, ví dụ, tất cả các hội đồng của bạn được tải từ thư mục nơi ứng dụng chạy, bạn có thể quét qua và bắt buộc tải. Nếu bạn đang làm bất cứ điều gì kỳ lạ, như chuyển hướng tải lắp ráp ... của nó phức tạp hơn. Nếu bạn biết trước thời gian mà hội đồng bạn mong đợi ở đó, thì điều đơn giản nhất là chỉ để tham khảo một số loại trong mỗi hội đồng đó. –

Các vấn đề liên quan