2012-12-19 19 views
3

我試圖構建一個lambda表達式並將其傳遞給rulefor。該代碼編譯,但在執行我得到的消息follwing ..傳遞lambda表達式的流利驗證

「‘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"); 
    } 
}