gpt4 book ai didi

c# - Fluent Validation 传入 lambda 表达式

转载 作者:行者123 更新时间:2023-11-30 17:08:13 24 4
gpt4 key购买 nike

我正在尝试构建一个 lambda 表达式并将其传递给 rulefor。代码编译,但在执行时我收到以下消息..

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

}
}

感谢任何帮助...

最佳答案

我不确定这是否是您可能希望得到的帮助,但是,您所提议的是对流畅框架的非常规使用。您注释掉的代码是使用此框架的常用方法。这为您提供了封闭的通用验证器类 (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");
}
}

关于c# - Fluent Validation 传入 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13947909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com