簡體   English   中英

大於或等於與流利驗證的枚舉比較?

[英]Greater than or equals comparison against an enum with 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'類型的成員 - 類型不兼容。”

經過一些編輯后,我想出了一個包裝來做我所希望的,但我更喜歡更優雅的解決方案。 我用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包裝器,以便我可以根據枚舉值有條件地驗證許多規則?

您看到的錯誤(“驗證程序'FirstValidator'無法驗證'MyEnum'類型的成員 - 類型不兼容”)是因為使用SetValidator您嘗試使用FirstValidator驗證anEnum 屬性 (它只能驗證MyObject的實例) - 這不是正確的方法。 如果要基於枚舉屬性觸發規則,則需要使用FluentValidation對條件的支持。

如果您只有一個規則要應用條件,那么您可以這樣做:

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

}

您正在使用CLR的Object.Equals() ,您需要使用Equal()或庫提供的任何其他內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM