C# FluentValidation:默认情况下自动为所有属性应用规则

C# FluentValidation:默认情况下自动为所有属性应用规则,c#,reflection,fluentvalidation,C#,Reflection,Fluentvalidation,我有一个具有某些属性的类Person,因此我希望在默认情况下自动为所有属性应用FluentValidation规则 例如: string:NotNull()、NotEmpty()、Length()… enum:IsInEnum() List:NotNull()或其他… 人员和扩展方法 public enum Gender { Male, Female } public class Person { public Gender Gender { get; set; }

我有一个具有某些属性的类Person,因此我希望在默认情况下自动为所有属性应用FluentValidation规则

  • 例如:
    • string:NotNull()、NotEmpty()、Length()…
    • enum:IsInEnum()
    • List:NotNull()或其他…
人员和扩展方法

public enum Gender { Male, Female }

public class Person
{
    public Gender Gender { get; set; }
    public string Name { get; set; }
    public List<string> Notes { get; set; }
}

public static class Extension
{
    public static Expression<Func<T, TProperty>> GenerateExpression<T, TProperty>(PropertyInfo propInfo)
    {
        ParameterExpression paramExp = Expression.Parameter(typeof(T));
        MemberExpression memExp = Expression.Property(paramExp, propInfo);
        UnaryExpression unaryExp = Expression.Convert(memExp, propInfo.PropertyType);
        return Expression.Lambda<Func<T, TProperty>>(unaryExp, paramExp);
    }
}
个人验证程序

public class PersonValidator : BaseValidator<Person> { }
公共类PersonValidator:BaseValidator{}
节目

public class Program
{
    public static void Main(string[] args)
    {
        Person person = new Person
        {
            Name = "Name",
            Gender = Gender.Male,
            Notes = new List<string> { "Note 1", "Note 2" }
        };

        PersonValidator validation = new PersonValidator();
        ValidationResult result = validation.Validate(person);

        foreach (var error in result.Errors)
        {
            Console.WriteLine(error);
        }

        Console.ReadKey();
    }
}
公共类程序
{
公共静态void Main(字符串[]args)
{
人=新人
{
Name=“Name”,
性别=性别。男性,
注释=新列表{“注释1”、“注释2”}
};
PersonValidator validation=新PersonValidator();
ValidationResult=验证。验证(人);
foreach(result.Errors中的变量错误)
{
控制台写入线(错误);
}
Console.ReadKey();
}
}

您可以尝试使用以下方法:

UnaryExpression unaryExp = Expression.Convert(memExp, typeof(TProperty));
而不是:

UnaryExpression unaryExp = Expression.Convert(memExp, propInfo.PropertyType);

它应该对泛型属性有帮助,但恐怕对枚举没有帮助
IsInEnum
方法必须知道枚举属性的实际类型,而不仅仅是
enum

您可以尝试使用以下方法:

UnaryExpression unaryExp = Expression.Convert(memExp, typeof(TProperty));
而不是:

UnaryExpression unaryExp = Expression.Convert(memExp, propInfo.PropertyType);
它应该对泛型属性有帮助,但恐怕对枚举没有帮助
IsInEnum
方法必须知道枚举属性的实际类型,而不仅仅是
enum