C# 流畅的验证传递lambda表达式

C# 流畅的验证传递lambda表达式,c#,validation,lambda,fluentvalidation,C#,Validation,Lambda,Fluentvalidation,我试图构建一个lambda表达式并将其传递到rulefor。代码可以编译,但在执行时,我得到以下消息 “'FluentValidation.Internal.RuleBuilder'不包含'Length'的定义” 这是验证代码,这是。其目的是,在两个验证器中,我希望相同的验证规则再次应用于用户名或其他属性 public class UserValidator : AbstractValidator<DTO.User> { public UserValidator(DTO.Us

我试图构建一个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");
            }

        }
    }
公共类UserValidator:AbstractValidator
{
公共用户验证程序(DTO.User u)
{
foreach(PropertyInfo属性位于
此.GetType().BaseType
.GetGenericArguments()[0]
.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
如果(property.Name==“用户名”)
{
ParameterExpression参数=Expression.parameter(typeof(DTO.User),“p”);
Expression propertyAccess=Expression.Property(参数,属性);
//使在不知道属性的情况下调用RuleFor变得更容易
动态lambda=Expression.lambda(propertyAccess,参数);
规则(lambda)
.长度(4,9)
.WithMessage(“有效期为4至9个字符”);
//RuleFor(x=>x.Username)
//.长度(4,9)
//.WithMessage(“有效期为4至9个字符”);
}
}
}

感谢任何帮助…

我不确定这是否是您希望得到的帮助,但是,您建议的是对fluent框架的非常规使用。注释掉的代码是使用此框架的常用方式。这使您能够在封闭的通用验证程序类(
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");
    }
}
公共类用户
{
公共字符串用户名{get;set;}
公共字符串名{get;set;}
公共字符串LastName{get;set;}
}
公共类UserValidator:AbstractValidator
{
公共用户验证程序()
{
this.ValidateName(x=>x.Username);
this.ValidateName(x=>x.FirstName);
this.ValidateName(x=>x.LastName);
}
}
公共静态类ValidationExtensions
{
公共静态void ValidateName(此抽象验证器验证器,表达式属性)
{
validator.RuleFor(property).Length(4,9).WithMessage(“在4到9个字符之间有效”);
}
}

快速提示:在标签列表中添加您正在使用的语言(我刚刚完成)。您的问题将有更多机会被专家以该语言阅读。我希望大多数人都会根据与他们相关的标签过滤问题。