2012-12-19 4 views
3

람다 식을 작성하여이를 rulefor에 전달하려고합니다. 이 코드는 컴파일하지만 나는 follwing을 메시지가 실행할 때 ..람다 식에서 전달하는 유창한 유효성 검사

이 유효성 검사 코드는 다음입니다 " 'FluentValidation.Internal.RuleBuilder'는 '길이'에 대한 정의가 포함되어 있지 않습니다." 목표는 두 명의 유효성 검사기에서 동일한 유효성 검사 규칙을 다시 사용자 이름 또는 다른 속성에 적용해야한다는 것입니다.

public class UserValidator : AbstractValidator<DTO.User> 
{ 
    public UserValidator(DTO.User u) 
    { 

     foreach (PropertyInfo property in 
       this.GetType().BaseType 
        .GetGenericArguments()[0] 
        .GetProperties(BindingFlags.Public | BindingFlags.Instance)) 
     { 


      if (property.Name == "Username") 
      { 

       ParameterExpression parameter = Expression.Parameter(typeof(DTO.User), "p"); 
       Expression propertyAccess = Expression.Property(parameter, property); 
       // Make it easier to call RuleFor without knowing TProperty 
       dynamic lambda = Expression.Lambda(propertyAccess, parameter); 

       RuleFor(lambda) 
        .Length(4, 9) 
        .WithMessage("Valid between 4 and 9 chars"); 

       //RuleFor(x => x.Username) 
       // .Length(4, 9) 
       // .WithMessage("Valid between 4 and 9 chars"); 
      } 

     } 
    } 

어떤 도움을 주시면 감사 ...

+2

빠른 팁 : 언어를 추가

당신이 정말로 다음 길이를 주장 코드의 반복을 피하기하려면 아마도 인수로 식을 취 도우미를 사용하여 할 수있는, 말했다 당신이 당신의 태그 목록에서 사용하고 있습니다 (방금했습니다). 귀하의 질문은 해당 언어의 전문가가 읽을 기회가 더 많습니다. 대부분의 사람들은 관련 태그로 질문을 필터링 할 것으로 기대합니다. – Flanfl

답변

2

나는 당신이 제안하고있는 것은 유창 프레임 워크의 틀에 얽매이지 않는 사용하는 것입니다, 이것은 당신이 희망 할 수있다 도움의 종류인지 모르겠지만, . 주석 처리 된 코드는이 프레임 워크를 사용하는 일반적인 방법입니다. 이렇게하면 마술 문자열 및 리플렉션을 사용하지 않고 닫힌 일반 유효성 검사기 클래스 (UserValidator) 내에서 강력한 입력을 제공합니다.

public class User 
{ 
    public string Username { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class UserValidator : AbstractValidator<User> 
{ 
    public UserValidator() 
    { 
     this.ValidateName(x => x.Username); 
     this.ValidateName(x => x.FirstName); 
     this.ValidateName(x => x.LastName); 
    } 
} 

public static class ValidationExtensions 
{ 
    public static void ValidateName<TV>(this AbstractValidator<TV> validator, Expression<Func<TV, string>> property) 
    { 
     validator.RuleFor(property).Length(4, 9).WithMessage("Valid between 4 and 9 chars"); 
    } 
} 
관련 문제