C# 流畅的验证传递lambda表达式
我试图构建一个lambda表达式并将其传递到rulefor。代码可以编译,但在执行时,我得到以下消息 “'FluentValidation.Internal.RuleBuilder'不包含'Length'的定义” 这是验证代码,这是。其目的是,在两个验证器中,我希望相同的验证规则再次应用于用户名或其他属性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
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个字符之间有效”);
}
}
快速提示:在标签列表中添加您正在使用的语言(我刚刚完成)。您的问题将有更多机会被专家以该语言阅读。我希望大多数人都会根据与他们相关的标签过滤问题。