2010-09-23 8 views

Odpowiedz

45

Właściwie to jest całkiem fajne. Użyłem go ostatnio w implementacji sprawdzania poprawności WFP. Większość osób kończy pisanie dużej ilości kodu za pomocą refleksji, aby dokonać iteracji atrybutów, ale jest w tym wbudowana funkcja.

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

Można również sprawdzić atrybuty na jednej nazwie właściwości. Można też ewentualnie przejść na liście w celu uzyskania dostępu do komunikatów o błędach:

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

Skończyło się na tym, że napisałem dużo kodu do namysłu, aby to zrobić, podczas gdy czekałem na odpowiedź :( –

+0

Tak, zaskakująco niewiele przykładów przy użyciu tego API, i ładuje za pomocą refleksji! – TheCodeKing

+0

nie jest wielkim fanem parametrów wyjściowych, więc podniosłem niestandardowy wyjątek zamiast (niemożliwe do zignorowania) –

2

Klasy System.ComponentModel.DataAnnotations.ValidationAttribute mają metody, które wykonują logikę sprawdzania poprawności (012). Biorą obiekt (wartość pola, które ozdabiają) i zwracają true lub false.

Możesz użyć tych atrybutów i trochę refleksji, aby przetoczyć własny walidator zorientowany na aspekt. Przekaż walidator obiektowi, a walidator otrzyma listę PropertyInfo s oraz FieldInfo s. Dla każdego z nich może wywołać GetCustomAttributes, aby wyszukać te, które dziedziczą po ValidationAttribute, a dla każdego z nich wywołać IsValid, przekazując wartość właściwości lub pola. Można to zrobić całkowicie dynamicznie, nie znając struktury klasy, która ma być zatwierdzona w czasie projektowania.

+0

Mogę zadzwonić do 'TryValidateProperty' przechodząc losową instancję' ValidationAttribute' wykonać na? – Shimmy

Powiązane problemy