Подтвердить что ты не робот

Как я могу использовать атрибуты проверки данных в С# в контексте nonASP.net?

Я хотел бы использовать атрибуты проверки данных в сборке библиотеки, чтобы любой потребитель данных мог проверить его без использования ModelBinder (например, в консольном приложении). Как я могу это сделать?

4b9b3361

Ответ 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, передав значение свойства или поля. Это можно сделать полностью динамически, не зная структуру класса, подлежащего проверке во время разработки.