Как использовать специальный валидатор аннотаций POCO без какой-либо платформы (без asp.net, без mvc, без ORM) - PullRequest
0 голосов
/ 02 мая 2019

У меня есть пользовательский класс проверки

using System;
using System.Collections.Generic;
using System.Reflection;

 internal class RequiredAttribute1 : Attribute
{
    public RequiredAttribute1()
    {
    }

    public void Validate(object o, MemberInfo info, List<string> errors)
    {
        object value;

        switch (info.MemberType)
        {
            case MemberTypes.Field:
                value = ((FieldInfo)info).GetValue(o);
                break;

            case MemberTypes.Property:
                value = ((PropertyInfo)info).GetValue(o, null);
                break;

            default:
                throw new NotImplementedException();
        }

        if (value is string && string.IsNullOrEmpty(value as string))
        {
            string error = string.Format("{0} is required", info.Name);

            errors.Add(error);
        }
    }
}

Я использую его для следующего объекта: -

class Fruit
{
 [RequiredAttribute1]
 public string Name {get; set;}

 [RequiredAttribute1]
 public string Description {get; set;}
}

Теперь я хочу запустить правила проверки в спискефрукты, чтобы напечатать в строку
Все, что я могу придумать, это: -

  1. Итерация по фруктам
  2. Для каждого фрукта, итерация по его свойствам
  3. Для каждого свойства итерируйте пользовательские валидаторы (только 1 здесь ...)
  4. Вызовите функцию валидации
  5. Соберите и распечатайте ошибки валидатора

Есть ли что-то проще?чем эта и более встроенная, для чтения этих аннотаций, без необходимости добавления каркасных библиотек типа (ASP.net / MVC / etc ...)?
Это просто для простого консольного приложения.

1 Ответ

0 голосов
/ 03 мая 2019

Мне удалось заставить его работать, используя

using System.ComponentModel.DataAnnotations;

class RequiredAttribute : ValidationAttribute
{ //... above code }

В основном классе драйверов ...

using System.ComponentModel.DataAnnotations;

class Driver
{

public static void Main(string[] args)
{
            var results = new List<ValidationResult>();
            var vc = new ValidationContext(AreaDataRow, null, null);
            var errorMessages = new List<string>();

            if (!Validator.TryValidateObject(AreaDataRow, vc, results, true))
            {
                foreach (ValidationResult result in results)
                {
                    if (!string.IsNullOrEmpty(result.ErrorMessage))
                    {
                        errorMessages.Add(result.ErrorMessage);
                    }
                }

                isError = true;
            }
}
}

Не требуется никаких фреймворков или ORMS, только библиотека DataAnnotations.
Может работать с несколькими [Атрибутами]

...