わかりました、列挙型の値に基づいて条件付きでオブジェクトを検証しようとしているとしましょう。どうすればそれを行うことができますか?
オブジェクトを検証するサンプル呼び出しを次に示します。
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 ラッパーを提供することなく内部コンテキストを参照する方法はありますか?