Больше или равно сравнению с перечислением с Fluent Validation? - PullRequest
3 голосов
/ 15 ноября 2011

Хорошо, допустим, я пытаюсь проверить объект условно на основе значения перечисления, как я могу это сделать?

Вот пример вызова для проверки объекта.

MyObjectValidator validator = new MyObjectValidator();
ValidationResult results = validator.Validate(new MyObject());

Вот пример класса со значением Enum.

public class MyObjectValidator : AbstractValidator<MyObject>
{

    public MyObjectValidator()
    {
        RuleFor(x => x.anEnum).Equal(MyObject.MyEnum.First).SetValidator(new FirstValidator());
    }

}

public class FirstValidator : AbstractValidator<MyObject>
{

    public FirstValidator()
    {
        RuleFor(x => x.someDecimal).Equal(1).WithMessage("Decimal must equal 5 with anEnum set to First");
    }

}

public class MyObject
{

    public enum MyEnum : int
    {
        First = 0,
        Second = 1,
        Third = 2
    }

    public decimal someDecimal { get; set; }
    public MyEnum anEnum { get; set; }

    public MyObject()
    {
        anEnum = MyEnum.First;
        someDecimal = 5;
    }
}

В этом конкретном примере выдается сообщение: «Средство проверки 'FirstValidator' не может проверять элементы типа 'MyEnum' - типы несовместимы."

После некоторого редактирования я придумал обертку, чтобы делать то, на что я надеюсь, но я бы предпочел более элегантное решение. Я заменил MyObjectValidator на

public MyObjectValidator()
{
    RuleFor(x => x.anEnum).SetValidator(new ValidatorWrapper<MyObject>()).When(x => x.anEnum == MyObject.MyEnum.First);
}

И добавил упаковщик валидатора

public class ValidatorWrapper<T> : PropertyValidator
{

    public ValidatorWrapper() : base("Validator Message")
    {
    }

    protected override bool IsValid(PropertyValidatorContext context)
    {
        MyObject myObj = (MyObject)context.Instance;
        FirstValidator validator = new FirstValidator();
        ValidationResult results = validator.Validate(myObj);
    }
}

Есть ли способ ссылаться на внутренний контекст без необходимости предоставлять оболочку propertyvalidator, чтобы я мог условно проверить ряд правил на основе значения перечисления?

Ответы [ 2 ]

5 голосов
/ 16 ноября 2011

Ошибка, которую вы видите («Валидатор FirstValidator не может проверить элементы типа« MyEnum »- типы несовместимы»), потому что с помощью SetValidator вы пытаетесь проверить свойство anEnum с FirstValidator (который может проверять только экземпляры MyObject) - это неправильный подход.Если вы хотите инициировать правила, основанные на свойстве enum, вам необходимо использовать поддержку условий FluentValidation.

Если у вас есть только одно правило, к которому вы хотите применить условие, то вы можете сделать это:

public class MyObjectValidator : AbstractValidator<MyObject> {

  public MyObjectValidator() {
      RuleFor(x => x.someDecimal).Equal(1).When(x => x.anEnum == MyObject.MyEnum.First);
  }

}

... альтернативно, если вы хотите применить одно и то же условие к нескольким правилам, вы можете использовать одно условие, используя метод верхнего уровня When:

public class MyObjectValidator : AbstractValidator<MyObject> {

    public MyObjectValidator() {
        When(x => x.anEnum == MyObject.MyEnum.First, () => {
            RuleFor(x => x.someDecimal).Equal(1);
            //other rules can go here
        });
    }

}
0 голосов
/ 15 ноября 2011

Вы используете CLR Object.Equals(), вам нужно использовать Equal() или все, что предоставляет библиотека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...