将类属性传递为泛型类型

本文关键字:泛型类型 属性 | 更新日期: 2023-09-27 18:03:13

我正在尝试为FluentValidation实现一个基类,它将快速构建类的验证器。我的基类函数试图将类的属性作为泛型类型参数,以便应用规则。但是,正如您将在代码中看到的那样,它在语法(以及其他方面)上并不完全正确。

可能更容易用代码来解释:

public class BaseValidator<T>  : AbstractValidator<T>
{
    public void ruleForText<U>(string msg)
    {
        RuleFor(obj => obj.U).NotEmpty().WithMessage(msg);
        RuleFor(obj => obj.U).Length(1, 100).WithMessage(msg);
        RuleFor(obj => obj.U).Matches("[A-Z]*").WithMessage(msg);
    }
    public void ruleForEmail<U>(string msg)
    {
        RuleFor(obj => obj.U).NotEmpty().WithMessage(msg);
        RuleFor(obj => obj.U).EmailAddress().WithMessage(msg);
    }
}
public class Member {
    public string Name { get; set; }
    public string Email { get; set; }
}
public class Post{
    public string Title { get; set; }
}
public class MemberValidator :BaseValidator<Member>
{
    public MemberValidator()
    {
        // Not valid syntax to pass name or even Member.Name
        // How can I pass Member.Name as the generic type?
        ruleForText<Name>();
        ruleForEmail<Email>();
    }
}
public class PostValidator :BaseValidator<Post>
{
    public MemberValidator()
    {
        ruleForText<Title>();
    }
}

将类属性传递为泛型类型

这可能是您正在寻找的。您需要传入一个表达式,函数参数为字符串。

public class BaseValidator<T> : AbstractValidator<T>
{
    public void RuleForText(Expression<Func<T, string>> expression, string msg)
    {
        RuleFor(expression).NotEmpty().WithMessage(msg);
        RuleFor(expression).Length(1, 100).WithMessage(msg);
        RuleFor(expression).Matches("[A-Z]*").WithMessage(msg);
    }
    public void RuleForEmail(Expression<Func<T, string>> expression, string msg)
    {
        RuleFor(expression).NotEmpty().WithMessage(msg);
        RuleFor(expression).EmailAddress().WithMessage(msg);
    }
}
public class MemberValidator : BaseValidator<Member>
{
    public MemberValidator()
    {
        RuleForText(member => member.Name, "My Message");
        RuleForEmail(member => member.Email, "My Message");
    }
}
public class Member
{
    public string Name { get; set; }
    public string Email { get; set; }
}