2011-07-25 42 views
12

Tôi đã tạo lớp Chú thích này
Ví dụ này có thể không có ý nghĩa bởi vì Nó sẽ luôn ném ngoại lệ nhưng tôi vẫn đang sử dụng nó vì tôi chỉ đang cố gắng giải thích câu hỏi của mình là gì. Chú thích của tôi không bao giờ được gọi vì một số lý do giải pháp?C# - Sử dụng chú thích tùy chỉnh?

public class AuthenticationRequired : System.Attribute 
{ 
    public AuthenticationRequired() 
    { 
     // My break point never gets hit why? 
     throw new Exception("Throw this to see if annotation works or not"); 
    } 
} 

[AuthenticationRequired] 
private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    // My break point get here 
} 
+4

Ở đây bạn có làm thế nào để truy cập và đọc chú thích tùy chỉnh của bạn: http://msdn.microsoft.com/en-us/library /z919e8tw.aspx#Y109 –

Trả lời

22

Chú thích của tôi không bao giờ được gọi vì một số lý do giải pháp?

Đây là một sự hiểu lầm về thuộc tính. Các thuộc tính tồn tại một cách hiệu quả để thêm siêu dữ liệu vào các phần nhất định của mã của bạn (các lớp, thuộc tính, trường, phương thức, tham số, v.v.) Trình biên dịch lấy thông tin trong thuộc tính và băm nó vào IL mà nó rút ra khi nó được thực hiện ăn nguồn của bạn mã.

Thuộc tính của chính họ không làm bất cứ điều gì trừ khi ai đó tiêu thụ chúng. Đó là, một người nào đó tại một số điểm phải khám phá thuộc tính của bạn và sau đó thực hiện hành động trên đó. Họ ngồi trong IL của hội đồng của bạn, nhưng họ không làm bất cứ điều gì trừ khi ai đó tìm thấy họ và hành động trên chúng. Chỉ khi họ làm điều này thì một thể hiện của thuộc tính được khởi tạo. Cách điển hình để làm điều này là sử dụng sự phản chiếu.

Để có được các thuộc tính trong thời gian chạy, bạn có thể nói cái gì đó như

var attributes = typeof(Foo) 
        .GetMethod("Window_Loaded") 
        .GetCustomAttributes(typeof(AuthenticationRequired), true) 
        .Cast<AuthenticationRequired>(); 

foreach(var attribute in attributes) { 
    Console.WriteLine(attribute.ToString()); 
} 
+0

Xin lỗi nếu điều này không biên dịch, tôi không có một trình biên dịch tiện dụng. – jason

+0

Cảm ơn câu trả lời, Có thể làm cho nó để khi một phương pháp có một thuộc tính cụ thể một khối mã cụ thể được gọi? Điều đó có được coi là thực hành không tốt? Giả sử tôi muốn mọi phương thức có thuộc tính "Log" để ghi lại thời gian. Tôi đang cố gắng sử dụng phương pháp này để sử dụng lại mã – aryaxt

+2

@aryaxt: Có, có thể thực hiện điều đó. Nhưng bạn cần một cái gì đó để xây dựng cho bạn (bạn có thể tự mình làm, nhưng có những công cụ sẵn có sẽ làm điều đó cho bạn). Những gì bạn đang tìm kiếm là cái gì đó sẽ tự động xây dựng một proxy cho bạn. Những mối quan tâm này thường được gọi là mối quan tâm xuyên suốt, và loại lập trình này được gọi là lập trình hướng khía cạnh. Ví dụ: nếu bạn xem xét khả năng chặn trong Castle Windsor, bạn sẽ thấy cách thực hiện: http://www.castleproject.org/container/documentation/trunk/usersguide/interceptors.html – jason

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