[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