2010-09-23 1 views

Antwort

45

Eigentlich ist das ziemlich cool. Ich habe es kürzlich in einer WFP-Validierungsimplementierung verwendet. Die meisten Leute schreiben mit Hilfe von Reflektion viel Code, um die Attribute zu iterieren, aber dafür gibt es eine eingebaute Funktion.

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

Sie können Attribute auch für eine einzelne benannte Eigenschaft überprüfen. Sie können auch in einer Liste übergeben, um gegebenenfalls die Fehlermeldungen zuzugreifen:

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

Ich schrieb viel Reflexion Code, um dies zu tun, während ich auf eine Antwort wartete :( –

+0

Yeah überraschend wenige Beispiele rund um die Verwendung dieser API, und lädt mit Reflektion! – TheCodeKing

+0

nicht ein großer Fan von Ausgabeparametern, so habe ich eine Gewohnheit Ausnahme: ( –

2

Die Klassen System.ComponentModel.DataAnnotations.ValidationAttribute haben IsValid Methoden, die die Validierungslogik ausführen. Sie nehmen ein Objekt (den Wert des Feldes, das sie verzieren) und geben true oder false zurück.

Sie können diese Attribute und ein wenig Nachdenken verwenden, um Ihren eigenen aspektorientierten Validator zu rollen. Übergeben Sie Ihrem Prüfer ein Objekt, und der Prüfer erhält eine Liste von PropertyInfo s und FieldInfo s. Für jede von diesen kann sie GetCustomAttributes aufrufen, um nach denen zu suchen, die von ValidationAttribute erben, und für jede von diesen rufen Sie IsValid an, den Wert der Eigenschaft oder des Felds übergebend. Dies kann vollständig dynamisch erfolgen, ohne die Struktur der Klasse zu kennen, die zur Entwurfszeit validiert werden soll.

+0

Kann ich die 'TryValidateProperty' nennen eine zufällige Instanz von' ValidationAttribute' vorbei führen an? – Shimmy