2010-09-23 8 views

Trả lời

45

Thực ra điều này khá thú vị. Gần đây, tôi đã sử dụng nó trong một triển khai xác thực WFP. Hầu hết mọi người đều viết rất nhiều mã bằng cách sử dụng sự phản chiếu để lặp lại các thuộc tính, nhưng có một hàm dựng sẵn cho việc này.

var vc = new ValidationContext(myObject, null, null); 
return Validator.TryValidateObject(myObject, vc, null, true); 

Bạn cũng có thể xác thực thuộc tính trên một thuộc tính được đặt tên. Bạn cũng có thể tùy ý chuyển vào danh sách để truy cập vào thông báo lỗi:

var results = new List<ValidationResult>(); 
var vc = new ValidationContext(myObject, null, null) { MemberName = "UserName"}; 
var isValid = Validator.TryValidateProperty(value, vc, results); 

// get all the errors 
var errors = Array.ConvertAll(results.ToArray(), o => o.ErrorMessage); 
+0

Tôi đã viết rất nhiều mã phản chiếu để làm điều này trong khi chờ đợi một câu trả lời: ( –

+0

Có một số ví dụ đáng ngạc nhiên xung quanh việc sử dụng API này, và tải bằng cách sử dụng sự phản chiếu! – TheCodeKing

+0

không phải là một lượng lớn các tham số đầu ra. ngoại lệ thay vì (không thể bỏ qua) –

2

Các lớp System.ComponentModel.DataAnnotations.ValidationAttribute có các phương thức IsValid thực hiện logic xác thực. Họ lấy một đối tượng (giá trị của trường họ trang trí) và trả lại true hoặc false.

Bạn có thể sử dụng các thuộc tính này và phản ánh một chút để cuộn trình xác thực theo hướng của riêng bạn. Chuyển cho trình xác thực của bạn một đối tượng và trình xác thực sẽ nhận được danh sách PropertyInfo s và FieldInfo s. Đối với mỗi trong số này, nó có thể gọi GetCustomAttributes để tìm kiếm những người được kế thừa từ ValidationAttribute và đối với mỗi trong số này, hãy gọi IsValid, chuyển giá trị của thuộc tính hoặc trường. Điều này có thể được thực hiện hoàn toàn tự động mà không biết cấu trúc của lớp được xác nhận tại thời điểm thiết kế.

+0

Tôi có thể gọi 'TryValidateProperty' chuyển một thể hiện ngẫu nhiên' ValidationAttribute' để thực hiện không? – Shimmy