2011-11-15 67 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

这是原始示例中的拼写错误 –