2009-07-22 23 views
5

tôi đã tạo ra một thuộc tính đơn giản:Tại sao thuộc tính .NET của tôi không thực hiện một hành động?

[AttributeUsage(AttributeTargets.Method)] 
public class InitAttribute : System.Attribute 
{ 
    public InitAttribute() 
    { 
     Console.WriteLine("Works!"); 
    } 
} 

và tôi áp dụng nó vào một phương pháp đơn giản:

static class Logger 
{ 
    public static string _severity; 

    public static void Init(string severity) 
    { 
     _severity = severity; 
    } 

    [Init()] 
    public static void p() 
    { 
     Console.WriteLine(_severity); 
    } 
} 

gì đang xảy ra là khá streight-forward. Chỉ, tôi mong đợi thuộc tính để thực hiện một hành động (in ấn tác phẩm!), Nhưng điều này không xảy ra.

Nghiện, in "Hoạt động!" dĩ nhiên chỉ dành cho mục đích gỡ lỗi: Tôi muốn truy cập vào tài sản của dụ_severity (để kiểm tra xem có! = null chẳng hạn), nhưng mọi thứ tôi vẫn đọc về các thuộc tính (khá mới đối với tôi) là về cách truy cập các phương pháp hoặc thuộc tính của lớp ' và cứ thế thông qua phản ánh. Khi tôi đã đánh giá _severity, làm thế nào tôi có thể sửa đổi hành vi của phương pháp được trang trí (trong trường hợp này, tăng một ngoại lệ "Logger không được khởi tạo" và không thực hiện nó)?

Bất kỳ trợ giúp nào được đánh giá cao.

Trả lời

11

Nếu bạn cần thực hiện hành động khi điều khiển nhập phương thức, bạn nên xem aspect-oriented programming và các khung như PostSharp. Các thuộc tính không được thiết kế để tự thực hiện bất kỳ thứ gì. Chúng chỉ là một loạt dữ liệu (hoặc siêu dữ liệu nếu bạn muốn) gắn liền với các công cụ trong các hội đồng IL có thể được truy vấn trong thời gian chạy.

+7

Một điều khiến người dùng đặt câu hỏi này là cách mà các khung công tác như ASP.Net MVC thêm các móc vào các thuộc tính trong những thứ như ActionFilterAttribute, để chúng xuất hiện để làm điều gì đó. Điều này khuyến khích mọi người cố gắng để có được các thuộc tính bình thường để chủ động hơn. –

1

Thuộc tính chỉ cho phép trang trí các loại và thành viên, nhưng bản thân thuộc tính không thể truy cập đối tượng được trang trí. Bạn sẽ phải sử dụng các tham số hàm tạo của thuộc tính để truyền vào bất kỳ dữ liệu nào mà bạn yêu cầu để làm việc với bên trong thuộc tính.

Nếu bạn muốn sử dụng thuộc tính để tự động thay đổi hành vi của đối tượng đích, bạn sẽ phải xem xét các giải pháp AOP như PostSharp.

1

Thuộc tính không bao giờ thực sự được khởi tạo và vì vậy hàm tạo của nó không bao giờ được gọi. Thuộc tính vẫn là siêu dữ liệu cho đến khi bạn sử dụng sự phản chiếu để lấy nó. Như đã được đề cập trước đó, bạn đang làm gì sau đây là một công cụ lập trình hướng Aspect. PostSharp hoạt động bằng cách thay đổi assembly như là một bước post-build. Nếu bạn đang sử dụng Castle Windsor hoặc Unity Inversion của hộp kiểm soát cả hai đều cung cấp khả năng AOP là tốt.

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