2011-11-15 89 views
3

好吧,假設我試圖根據枚舉的值有條件地驗證一個對象,我該怎麼做?大於或等於與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包裝,這樣我可以有條件地驗證基於一些規則的方式在枚舉值?

+0

Fluent驗證提供了一個名爲'Equal()'而不是'Equals()'的驗證程序。 – drharris

+0

什麼是MyFirstEnumValidator?一個簡短但完整的例子在這裏真的會有所幫助... –

+0

我已經更新了示例 –

回答

5

你看到的錯誤(「驗證器‘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); 
    } 

} 

...或者,如果你想申請相同的條件下,以多規則,您可以使用頂級的單個條件當方法:

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 
     }); 
    } 

} 
0

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

+0

這是原始示例中的拼寫錯誤 –