На самом деле это довольно круто. Я недавно использовал его в реализации проверки ВПП. Большинство людей заканчивают тем, что пишут много кода, используя отражение для итерации атрибутов, но для этого есть встроенная функция.
var vc = new ValidationContext(myObject, null, null);
return Validator.TryValidateObject(myObject, vc, null, true);
Вы также можете проверять атрибуты для одного именованного свойства. Вы также можете при желании передать список для доступа к сообщениям об ошибках:
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);