好吧,假設我試圖根據枚舉的值有條件地驗證一個對象,我該怎麼做?大於或等於與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?一個簡短但完整的例子在這裏真的會有所幫助... –
我已經更新了示例 –