2009-06-10 46 views
24

Kịch bản: Tôi có lớp cơ sở "MyBase". Tôi có một thuộc tính tùy chỉnh "MyAttrib"Buộc sử dụng thuộc tính tùy chỉnh

Với rằng tôi làm điều này:

[MyAttrib(1234)] 
class MyClass : MyBase() 
{ 
MyClass() 
{ 
} 
} 

Câu hỏi: Tôi có thể ở bất kỳ lớp học có hiệu lực cách inherting từ MyBase để có MyAttrib thuộc tính?

Trả lời

25

Không, không có cách nào để trình biên dịch yêu cầu thuộc tính trong C#. Bạn có một số tùy chọn khác có sẵn cho bạn. Bạn có thể viết một bài kiểm tra đơn vị phản ánh trên tất cả các loại trong assembly và kiểm tra thuộc tính. Nhưng tiếc là không có cách nào để trình biên dịch buộc sử dụng một thuộc tính.

+0

Xem câu trả lời dưới đây bởi @ frederik-gheysels – devinbost

1

Bạn có thể sử dụng PostSharp cho việc này. Thừa kế lớp thuộc tính của bạn từ lớp OnMethodInvocationAspect (PostSharp) và ghi đè lên phương thức CompileTimeValidate.

Một chút tương tự; mặc dù cách khác xung quanh (tôi chỉ muốn rằng một thuộc tính nhất định có thể được áp dụng cho các lớp học mà thực hiện một giao diện cụ thể): http://fgheysels.blogspot.com/2008/08/locking-system-with-aspect-oriented.html

2

Những gì tôi đã làm là có một tài sản trừu tượng hoặc phương thức trong lớp MyBase, do đó kế thừa lớp buộc phải ghi đè (và do đó thực hiện) thuộc tính/phương thức này.

Không sạch như một thuộc tính, nhưng tốt hơn là kiểm tra thời gian chạy theo ý kiến ​​của tôi.

+0

Tôi nghĩ rằng điều này thậm chí còn sạch hơn, nếu nó phù hợp với kịch bản. –

0

Nếu bạn muốn đảm bảo rằng tất cả các lớp của một kiểu cơ sở hoặc giao diện có thuộc tính, bạn có thể thêm một bài kiểm tra đơn vị đơn giản nhận tất cả các lớp dẫn xuất và khẳng định chúng có thuộc tính và thêm kết quả của đơn vị kiểm tra quá trình xây dựng tiếp theo của bạn.

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