3

わかりました、列挙型の値に基づいて条件付きでオブジェクトを検証しようとしているとしましょう。どうすればそれを行うことができますか?

オブジェクトを検証するサンプル呼び出しを次に示します。

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 ラッパーを提供することなく内部コンテキストを参照する方法はありますか?

4

2 に答える 2

5

表示されているエラー(「バリデーター'FirstValidator'はタイプ'MyEnum'のメンバーを検証できません-タイプは互換性がありません」)は、SetValidatorを使用して、FirstValidator(検証のみが可能)でanEnumプロパティを検証しようとしているためです。 MyObjectのインスタンス)-これは正しいアプローチではありません。enumプロパティに基づいてルールをトリガーする場合は、FluentValidationの条件のサポートを使用する必要があります。

条件を適用するルールが1つしかない場合は、次のように実行できます。

public class MyObjectValidator : AbstractValidator<MyObject> {

  public MyObjectValidator() {
      RuleFor(x => x.someDecimal).Equal(1).When(x => x.anEnum == MyObject.MyEnum.First);
  }

}

...あるいは、同じ条件を複数のルールに適用する場合は、最上位のWhenメソッドを使用して単一の条件を使用できます。

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

}
于 2011-11-16T17:02:15.870 に答える
0

CLR を使用しています。ライブラリが提供するものObject.Equals()を使用する必要があります。Equal()

于 2011-11-15T18:59:37.820 に答える