我正在尝试构建一个lambda表达式并将其传递给rulefor。代码编译,但在执行时,我得到了以下消息..
“'FluentValidation.Internal.RuleBuilder'不包含'Length'的定义”
这是验证码。目的是在两个验证器中,我希望再次应用相同的验证规则用户名或另一个属性。
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");
}
}
}
任何帮助表示赞赏...
答案 0 :(得分: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");
}
}