C# 实现通用实体类数据合法校验 (利用特性 Attribute)

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public abstract class BaseAttribute : Attribute
{
    public virtual string error { get; set; }
    public abstract bool Validate(object value);
}
/// <summary>
/// 约束符合正则表达式
/// </summary>
public class RegexAttribute : BaseAttribute
{
    public string regexText;
    public override string error
    {
        get
        {
            if (base.error != null)
            {
                return base.error;
            }
            return "属性值不能为空";
        }
        set => base.error = value;
    }
    public override bool Validate(object value)
    {
        var regex = new Regex(regexText);
        if (value == null)
        {
            return false;
        }
        return regex.Match(value.ToString()).Success;
    }
}
/// <summary>
/// 约束属性不能为空
/// </summary>
public class RequiredAttribute : BaseAttribute
{
    public override string error
    {
        get
        {
            if (base.error != null)
            {
                return base.error;
            }
            return "属性不能为空";
        }
        set => base.error = value;
    }
    public override bool Validate(object value)
    {
        return !(value == null);
    }
}
/// <summary>
/// 约束字符串的长度范围
/// </summary>
public class StringRangeAttribute : BaseAttribute
{
    public int min { get; set; }
    public int max { get; set; }
    public override string error
    {
        get
        {
            if (base.error != null)
            {
                return base.error;
            }
            return $"字符串长度范围{this.min}-{this.max}";
        }
        set => base.error = value;
    }
    public override bool Validate(object value)
    {
        return value?.ToString().Length >= this.min && value.ToString().Length <= this.max;
    }
}
public static class ValidateFun
 {
     public static string Validate<T>(this T t)
     {
         Type type = t.GetType();

         //获取所有属性
         PropertyInfo[] propertyInfos = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
         List<string> errorList = new List<string>();
         foreach (PropertyInfo propertyInfo in propertyInfos)
         {
             if (propertyInfo.IsDefined(typeof(BaseAttribute)))//如果属性上有定义该属性,此步没有构造出实例
             {
                 foreach (BaseAttribute attribute in propertyInfo.GetCustomAttributes(typeof(BaseAttribute)))
                 {
                     if (!attribute.Validate(propertyInfo.GetValue(t, null)))
                     {
                         errorList.Add($"[{propertyInfo.Name}]" + attribute.error);
                     }
                 }

             }
         }
         return string.Join(",", errorList);
     }
 }
 public class Student
 {
     [Required(error = "id 不能为空!")]
     public int? id { get; set; }
     [Regex(regexText = "^a.*a$", error = "属性不合格规则")]
     [StringRange(min = 5, max = 10)]
     public string name { get; set; }
 }

校验调用

class Program
{
    static void Main(string[] args)
    {
        Student student = new Student()
        {
            id = null,
            name = "ajga555555xba"
        };
        string errorStr = student.Validate();
        if (string.IsNullOrEmpty(errorStr))
        {
            Console.WriteLine("校验成功");
        }
        else
        {
            // 输出结果 [id]id 不能为空!,[name]字符串长度范围5-10
            Console.WriteLine(errorStr);
        }
        Console.ReadKey();
    }
}

本文来自 www.luofenming.com