私は、列挙型の値に基づいてオブジェクトを条件付きで検証しようとしていますが、どうすればいいですか?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ラッパーを設けることなく、内側コンテキストを参照する方法はあります列挙型の値に?
Fluent Validationでは、Equals()ではなくValid()というバリデータが提供されます。 – drharris
「MyFirstEnumValidator」とは何ですか?短いが完全な例が本当にここに役立つでしょう... –
私はこの例を更新しました –