好吧,假设我试图根据枚举的值有条件地验证一个对象,我该怎么做?大于或等于与Fluent验证的枚举进行比较?
下面是一个示例调用来验证对象。
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包装,这样我可以有条件地验证基于一些规则的方式在枚举值?
Fluent验证提供了一个名为'Equal()'而不是'Equals()'的验证程序。 – drharris
什么是MyFirstEnumValidator?一个简短但完整的例子在这里真的会有所帮助... –
我已经更新了示例 –