2013-06-17 30 views
9

Tôi đã đấu tranh để tìm ví dụ về cách viết một thuộc tính tùy chỉnh để xác nhận các thông số phương pháp, tức là, biến dạng này:Làm thế nào để sử dụng tham số phương pháp tính

public void DoSomething(Client client) 
{ 
    if (client.HasAction("do_something")) 
    { 
     // ... 
    } 
    else 
    { 
     throw new RequiredActionException(client, "do_something"); 
    } 
} 

vào đây:

public void DoSomething([RequiredAction(Action="some_action")] Client client) 
{ 
    // ... 
} 

Theo như tôi có thể biết, tôi cần thêm thuộc tính này vào thuộc tính tùy chỉnh của mình, nhưng tôi không biết cách truy cập thông số được trang trí Client:

[AttributeUsageAttribute(AttributeTargets.Parameter)] 
public class RequireActionAttribute : System.Attribute 
{ 
    public Type Action {get; set;} 

    public RequireActionAttribute() 
    { 
     // .. How do you access the decorated parameter? 
     Client client = ??? 

     if (!client.HasAction(Action)) 
     { 
      throw new RequiredActionException(client, Action); 
     } 
    } 
} 
+0

Tại sao bạn không thể chỉ chấp nhận giao diện làm thông số? Ví dụ, bạn có thể có một 'IDoSomething'. –

+2

Bạn không thể truy cập mục được trang trí từ bên trong thuộc tính. Thuộc tính ngồi với kiểu siêu dữ liệu tĩnh, vì vậy bạn thực sự có được thuộc tính từ mục đó. Điều đó nói rằng, thuộc tính sau đó có thể có một phương pháp mà có một đối số đó là mục, nhưng sau đó bạn đang sử dụng một sledgehammer để crack một quả óc chó và có thể đã làm nó dễ dàng hơn nhiều mà không có thuộc tính. –

Trả lời

15

Bạn đang áp dụng chính xác - nhưng một thuộc tính về cơ bản không biết thành viên của nó. Điều này chắc chắn làm cho cuộc sống khó khăn hơn.

Nó không chỉ không có quyền truy cập vào các thành viên mà nó đề cập đến, nhưng thành viên đó sẽ là một ParameterInfo, không phải là một Client - không có cách nào dễ dàng truy cập vào giá trị của một tham số bên ngoài. Phương pháp của bạn sẽ cần phải gọi một số mã trợ giúp, chuyển giá trị client để xử lý nó một cách thích hợp ... hoặc bạn cần phải móc vào mã sẽ gọi phương thức của bạn để bắt đầu, để nhận thấy thuộc tính.

Không rõ chính xác bạn mong muốn sử dụng điều này như thế nào, nhưng cũng có thể bạn cần thay đổi thiết kế của mình một cách đáng kể.

0

Thuộc tính có thể được đặt vào chính phương thức đó. Khi tôi tìm kiếm giải pháp, tôi tìm thấy liên kết sau và cách nó sử dụng công cụ đánh chặn dường như tốt hơn http://www.codinginstinct.com/2008/05/argument-validation-using-attributes.html

+0

Bạn có thể giải thích thêm một chút không? –

+0

Tôi có thể đã hiểu sai mã gốc. Liên kết tôi đã đăng sử dụng trình chặn để xác thực mã. Nhận xét không cho phép tôi đăng mã từ đó. Nó chỉ trông với tôi rằng giải pháp này trông thanh lịch hơn so với xác nhận thuộc tính chúng tôi đã làm trong quá khứ. – Tony

2

Thuộc tính không đủ để thực hiện.

Nếu tôi hiểu chính xác bạn muốn thêm thuộc tính vào tham số để xác thực thuộc tính tại thời gian chạy và điều đó là không thể chỉ với thuộc tính.

Không thể vì thuộc tính chỉ là "siêu dữ liệu" và không được thực thi mã.

Bạn sẽ cần một số mã "thực" để đọc và hành động tương ứng. Mã đó có thể được tiêm vào thời gian biên dịch hoặc bạn có thể móc vào thực thi hàm.

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