大于或等于对具有流畅验证的枚举的比较
本文关键字:验证 枚举 比较 大于 | 更新日期: 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()
或库提供的其他任何内容