2010-05-24 28 views
6

Có cách nào để thực thi yêu cầu biên dịch cho các thuộc tính nhất định trên một lớp hoặc thực hiện giao diện không?Làm cách nào để yêu cầu thuộc tính trên định nghĩa lớp?

Ví dụ: giả sử ứng dụng của tôi sử dụng một loạt các lớp tĩnh chứa const int giá trị tài nguyên. Tôi muốn trang trí lớp học trong thuộc tính Description để mô tả nội dung của nó. Trong khái niệm, tôi muốn áp dụng yêu cầu thuộc tính này cho một giao diện, sau đó mỗi lớp tĩnh sẽ thực hiện nó với yêu cầu Description. Tôi có thể viết kiểm tra thời gian chạy hoặc kiểm tra đơn vị để kiểm tra sự tuân thủ. Nhưng thực sự là một kiểm tra thời gian biên dịch sẽ là tốt nhất.

Có điều gì không?

Trả lời

6

Không, không có gì giống như thế này. Đơn vị kiểm tra là tốt nhất bạn có thể làm, theo như tôi biết.

Nếu bạn có thể xác định các lớp tự động (theo tên hoặc một số thuộc tính khác mà lớp được trang trí) thì bạn có thể dễ dàng viết bài kiểm tra đơn vị cho tất cả các lớp trong một hội đồng.

+0

+1 Tôi kiểm tra đơn vị thứ hai cho điều đó, dễ viết và mặc dù nó sẽ không làm cho trình biên dịch phàn nàn, nó sẽ cảnh báo bạn sớm để thiếu thông tin. –

1

Có thể trong thời gian chạy, qua Phản chiếu.

Đây là một phương pháp thử nghiệm đơn vị cho bạn:

... 
using System.Reflection; 
using System.Diagnostics; 
using System.Linq; 
... 

[TestMethod] 
public void CheckAttributes() 
{ 
    var notAttributed = Assembly.GetAssembly(typeof(SomeClass)) 
     .GetTypes() 
     .Where(t => t.GetCustomAttributes(typeof(MyAttribute), true).Count() == 0); 

    Assert.AreEqual<int>(0, notAttributed.Count()); 
} 

đâu MyAttribute là loại thuộc tính của bạn, và SomeClass là một lớp trong lắp ráp bạn muốn kiểm tra.
Bạn cũng có thể lọc các loại bạn muốn kiểm tra theo cách này. (Chỉ khi bạn không yêu cầu mỗi lớp trong một hội đồng để sử dụng thuộc tính đó, dĩ nhiên rồi.)


Nếu bạn muốn làm điều đó trong mã sản xuất, đặt một thuộc tính Conditional("DEBUG") vào nó để chắc chắn rằng nó chỉ được thực hiện ở chế độ DEBUG.
(Vì Phản ánh không nhanh, và nó thực sự không có ý nghĩa khi chạy điều này trong chế độ sản xuất?)

+0

Bạn nên chạy nó trong các bài kiểm tra * đơn vị của bạn * đối với mã sản xuất. Tại sao bạn làm cho nó có điều kiện và đặt bản thân kiểm thử trong mã sản xuất của bạn? –

+0

@Jon - Tôi đã chỉnh sửa nó, bây giờ nó là một thử nghiệm đơn vị. Bây giờ nó có ý nghĩa không? : P – Venemo

+0

Tất cả ngoại trừ bạn đang thử nghiệm assembly thực thi, đó là một assembly thử nghiệm đơn vị và do đó không thể là mã sản xuất của bạn :) (tôi muốn sử dụng 'typeof (SomeWellKnownType) .Assembly'.) –

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