利用反射检查对象属性是否满足正则特

有时对象的属性需要满足某些正则,若是单独创建方法去一个个验证这些正则太过麻烦,这时我们可以给属性添加正则特性,如下:

   public class student
    {
        [RegularExpression(@"^[a-zA-Z]{1,20}$", ErrorMessage = "英文姓名必须是英文字符,且长度小于20!")]
        public string EName { get; set; }
    }

可是有时候对象实例的生成会绕过这些正则检查,例如直接从Excel里数据流写成对象。我们可以在数据流生成对象时候利用发射来检查生成对象是否满足正则表达。

 public static void ValidateInstatnce<T>(T t)
        {
            var objectT = Activator.CreateInstance<T>();
            var propertyInfoList = objectT.GetType().GetProperties();

            foreach (var property in propertyInfoList)
            {
                var proValue = property.GetValue(t,null);

                var attars = property.GetCustomAttributes();
                foreach (var attar in attars)
                {
                    try
                    {
                        var validateAttar = attar as ValidationAttribute;
                        if (validateAttar!=null)
                        {
                            //Null对象绕过正则检查,不会抛错,情理之中.
                            validateAttar.Validate(proValue ,property.Name);
                        }
                    }
                    catch (Exception e)
                    {
                        if (e is ValidationException)
                        {
                            throw;
                        }
                    }
                }
            }
        }

测试结果:

        public static void test()
        {
            try
            {
                var stu = new student { EName = "123" };
                ValidateInstatnce<student>(stu);
            }
            catch (Exception e)
            {
                
                throw e;
            }

        }
    }

抛出异常:

英文姓名必须是英文字符,且长度小于20!
原文地址:https://www.cnblogs.com/songsz1/p/4429803.html