Хорошо, допустим, я пытаюсь проверить объект условно на основе значения перечисления, как я могу это сделать?
Вот пример вызова для проверки объекта.
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, чтобы я мог условно проверить ряд правил на основе значения перечисления?