Я хотел бы использовать атрибуты проверки данных в сборке библиотеки, чтобы любой потребитель данных мог проверить его без использования ModelBinder (например, в консольном приложении). Как я могу это сделать?
Как я могу использовать атрибуты проверки данных в С# в контексте nonASP.net?
Ответ 1
На самом деле это довольно круто. Недавно я использовал его в реализации проверки WFP. Большинство людей в конечном итоге пишут много кода, используя отражение, чтобы перебирать атрибуты, но для этого есть встроенная функция.
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);
Ответ 2
В классах System.ComponentModel.DataAnnotations.ValidationAttribute
есть методы IsValid
, которые выполняют логику проверки. Они берут объект (значение поля, которое они украшают) и возвращают true
или false
.
Вы можете использовать эти атрибуты и немного отразить, чтобы свернуть собственный ориентированный на аспект валидатор. Передайте ваш валидатор объекту, и валидатор получит список PropertyInfo
и FieldInfo
s. Для каждого из них он может вызвать GetCustomAttributes
для поиска тех, которые наследуют от ValidationAttribute
, и для каждого из них вызовите IsValid
, передав значение свойства или поля. Это можно сделать полностью динамически, не зная структуру класса, подлежащего проверке во время разработки.