2011-11-15 2 views
3

자, 내가 열거 형의 값에 따라 조건부로 객체의 유효성을 검사하려고한다고 가정 해 봅시다. 어떻게 할 수 있습니까?Fluent Validation을 사용하는 enum보다 크거나 같은 비교입니까?

다음은 개체의 유효성을 검사하는 예제입니다.

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 '유형의 구성원을 확인할 수 없습니다 - 유형이 호환되지 않습니다."

약간의 편집을 마친 후에 나는 원하는 것을하기 위해 래퍼를 만들었지 만,보다 세련된 솔루션을 선호합니다. 제가

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

으로 MyObjectValidator를 대체 I 조건부 따라 규칙들을 확인할 수 있도록 propertyvalidator 래퍼를 제공하지 않고도, 내부 상황을 참조 할 수있는 방법이된다 검증 랩퍼

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

추가 enum 값에 따라?

+0

유창함 검증은'평등()'이 아닌'같음()'라는 검증을 제공 규칙, 당신은 방법을 때 최상위을 사용하여 하나의 조건을 사용할 수 있습니다. – drharris

+0

그리고'MyFirstEnumValidator' 무엇입니까? 간단하지만 완전한 * 예제가 실제로 여기에 도움이 될 것입니다 ... –

+0

예제를 업데이트했습니다 –

답변

5

당신이보고있는 오류 (" 'MyEnum'유형의 구성원의 유효성을 검사 할 수있는 검증 'FirstValidator'- 유형이 호환되지 않습니다")는 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); 
    } 

} 

을 ... 양자 택일로, 여러에 동일한 조건을 적용 할 경우

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

이것은 원래 예제의 오타였습니다. –

관련 문제