C#特性和实体类数据校验

特性Attribute
特性是用于运行时传递程序中的各种元素(比如类,方法,结构,枚举,组件等)的行为信息的声明性标签,可以使用特性向程序添加声明性信息,用来修饰各种需要被修饰的目标。我们可以对类、以及C#程序集中的成员进行进一步的描述。

相对于Java端的使用,起着注解的作用,用作数据校验功能时,放在实体类需要校验的字段上

对于需要特殊方法校验的字段,就需要生成一个自定义注解继承父类,然后自定义校验方法,通常有非空校验,字符串长度或这数字长度校验

例:非空校验生成,先生成自定义注解RequireAttribute 继承了基类(对于Java端的父类),

重写自定义的校验方法和反馈的校验信息

public class RequireAttribute : 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);
        }
    }

已知有实体类

  class JcSdmxDTO
    {
        /**
    * ID
    */
        public int? id{get;set;}

        /**
         * 住宿情况
         */
        [Require]
        public string zszt{get;set;}

        /**
         * 退宿日期
         */
        public DateTime? tsrq{get;set;}

        /**
         * 年份
         */
        [Require]
        public string year{get;set;}

        [Require]
        public string gs{get;set;}

        /**
         * 月份
         */
        [Require]
        public string month{get;set;}

        /**
         * 区域
         */
        [Require]
        public string qy{get;set;}

        /**
         * 房间号
         */
        [Require]
        public string fjh{get;set;}

        /**
         * 上月电表度数
         */
        public Double? dbdsShy{get;set;}

        /**
         * 本月电表度数
         */
        public Double? dbdsBy{get;set;}

        /**
         * 上月冷水度数
         */
        public Double? lsdsShy{get;set;}

        /**
         * 本月冷水度数
         */
        public Double? lsdsBy{get;set;}

        /**
         * 上月热水度数
         */
        public Double? rsdsShy{get;set;}

        /**
         * 本月热水度数
         */
        public Double? rsdsBy{get;set;}

        
      

    }

其中,对需要做校验的字段加上特性[Require]

然后再这个实体类中加入拓展方法

public static class Extension
    {
        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 (propertyInfo.GetValue(t).Equals(""))
                        {
                            propertyInfo.SetValue(t, null);
                        }
                        if (!attribute.Validate(propertyInfo.GetValue(t, null)))

                        {
                            errorList.Add($"[{propertyInfo.Name}]" + attribute.error);
                        }
                    }

                }
            }
            return string.Join(",", errorList);
        }
    }

由代码可知,校验过程是通过反射获取属性各字段,然后通过获取被定义到自定义特性的字段对应的数据,再对数据做自己的方法校验处理,,以上是做空值NULL的处理或者空字符的处理,如果输入的值为NULL,自定义的校验方法就会返回False

再根据自定义拓展方法中的判定会生成对应字段名的错误信息

 public override bool Validate(object value)
        {
            return !(value == null);
        }

最后如果返回的校验信息通过判定是否非空值,得到校验数据的结果信息,再抛出对应的异常和信息

  if (errorStr.Contains(field))
                                    {
                                        errorStr= cap + "数据不能为空";
                                    }

以导入excel为例 ,住宿情况zszt不可为空

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值