大于或等于对具有流畅验证的枚举的比较

本文关键字:验证 枚举 比较 大于 | 更新日期: 2023-09-27 18:14:37

好,假设我试图根据enum的值有条件地验证对象,我该怎么做呢?

下面是验证对象的示例调用。

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包装器,这样我就可以根据枚举值有条件地验证许多规则?

大于或等于对具有流畅验证的枚举的比较

你看到的错误("验证器'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
        });
    }
}

您正在使用CLR的Object.Equals(),您需要使用Equal()或库提供的其他任何内容