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


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

       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!
  • 相关阅读:
    CSP2020 游记
    关于对拍
    联考day7
    CSP 模拟26
    动态规划
    JAVA单元测试的用法和要点(入门篇)
    乐观锁和悲观锁的区别
    并发基础篇(六):线程Thread类的start()方法和run()方法【转载】
    this和super差异
    Java中的static关键字解析
  • 原文地址:https://www.cnblogs.com/songsz1/p/4429803.html
Copyright © 2020-2023  润新知