2011-11-15 7 views
3

私は、列挙型の値に基づいてオブジェクトを条件付きで検証しようとしていますが、どうすればいいですか?Fluent Validationを使用した列挙型と比較して大きいか等しいか?

ここでは、オブジェクトを検証するための呼び出し例を示します。

MyObjectValidator validator = new MyObjectValidator(); 
ValidationResult results = validator.Validate(new MyObject()); 

ここでは、列挙型の値を持つクラスのサンプルを示します。

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』 - タイプは互換性がありません。」

編集をしてから、私が望んでいることをするためのラッパーを思いついたが、より洗練されたソリューションを望んでいた。私は

public MyObjectValidator() 
{ 
    RuleFor(x => x.anEnum).SetValidator(new ValidatorWrapper<MyObject>()).When(x => x.anEnum == MyObject.MyEnum.First); 
} 

とMyObjectValidatorを交換し、バリラッパー

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 Validationでは、Equals()ではなくValid()というバリデータが提供されます。 – 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); 
    } 

} 

を...代わりに、あなたが複数に同じ条件を適用する場合ルールでは、最上位のWhenメソッドを使用して1つの条件を使用できます:

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

これは元の例のタイプミスです –

関連する問題