2010-09-23 30 views

Respuesta

45

En realidad, esto es muy bueno. Lo utilicé recientemente en una implementación de validación del PMA. La mayoría de las personas terminan escribiendo muchos códigos usando la reflexión para repetir los atributos, pero hay una función incorporada para esto.

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

También puede validar atributos en una sola propiedad con nombre. También se puede pasar opcionalmente en una lista con el fin de acceder a los mensajes de error:

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

Terminé escribiendo mucho código de reflexión para hacer esto mientras esperaba una respuesta :( –

+0

Sí, sorprendentemente, pocos ejemplos sobre el uso de esta API, y cargas utilizando la reflexión! – TheCodeKing

+0

no es un gran admirador de los parámetros de salida, así que planteé una costumbre excepción en su lugar (imposible de ignorar) –

2

Las clases System.ComponentModel.DataAnnotations.ValidationAttribute tienen IsValid métodos que realizan la lógica de validación. Toman un objeto (el valor del campo que decoran) y devuelven true o false.

Puede usar estos atributos, y un poco de reflexión, para hacer rodar su propio validador orientado a aspectos. Pase su validador un objeto, y el validador obtendrá una lista de PropertyInfo sy FieldInfo s. Para cada uno de estos, puede llamar al GetCustomAttributes para buscar los que heredan de ValidationAttribute, y para cada uno de ellos, llame al IsValid, pasando el valor de la propiedad o campo. Esto puede hacerse de forma totalmente dinámica sin conocer la estructura de la clase que se va a validar en el momento del diseño.

+0

¿Puedo llamar a la 'TryValidateProperty' pasar una instancia aleatoria de' ValidationAttribute' llevar a cabo en? – Shimmy

Cuestiones relacionadas