zoukankan      html  css  js  c++  java
  • 关于类属性值校验的一点记录 【知识点Attribute】

        好久没有进来了,之前励志坚持写博客,记录自己在做代码搬运工这段历程中点滴,可是仅仅只坚持了几天,就放弃了!果然是,世上无难事,只要肯放弃!哈哈……闲话不多说,开始进入正题,给自己留点笔记,避免将来老了,没有记忆了,还能翻开看看。也为了能给看到这篇文章的人,需要这点帮助的人一点提示,当然这篇文章也许不是最好的,也许没有讲到点子上,各位海涵!

       背景介绍:最近手头开发了一个功能,航运代理公司运送cargo的时候,需要将cago信息以EDI的形式发送给航空公司。至于EDI大家不懂的可以自行脑补一下(www.baidu.com).因为刚接触这个行业,所以也不敢妄自解释,我相信有朝一日肯定会写一篇关于EDI的博客。

      代理公司在发送edi的时候需要对EDI信息进行校验,如果信息不完整需要提示操作工,哪些信息没有值。所以对于开发者来说做好属性校验是一个标配工作。那么有的同学可能会说,直接对EDI信息类属性进行if else判断,可能是最简单粗暴的办法。当然如果你的EDI信息类不是很庞大也可以这样做。虽然说这样用if else 不是特别好,但只要是能解决问题也行,对吧。不提倡这样简单粗暴,一个程序或者说一个功能,如果if else 太多,我想就是行业外的人也觉得这样不妥。一个EDI文件是有点规模的,就目前我接触的EDI文件至少有80个类组成,这80个类每个类又有十几甚至好几十个property,这样的情况,如果用if else来的是不是就要吐血了。

      那么有点道行的人就说,你傻啊,你用反射啊,这样就能对每个类的每个属性进行判断了嘛!对没错,有道理,大写的赞。反射是可以,但是EDI的信息又不需要全部校验,你怎么办?比如说只对重要信息进行非空判断,对不重要的信息就让他过了,这时候,主角就来了,那就是Attribute特性。

       对于Attribute我就不做介绍了,了解的不深,只是刚好需要就拿过来用了,建议大家看看sdn的介绍。

        回归上面的话题,鉴于有的字段需要校验,有的字段不需要校验,所以我自定义了一个AttributeProperty类,他必须继承System.Attribute。然后我们在自定义类中添加自己需要的属性标记,例如我只是需要判断这个字段是否需要进行校验,那么我自定义一个bool类型属性。遇到false就不做校验,遇到true就进行校验。

     1 public class AttributeProperty: System.Attribute
     2     {
     3         private bool value;//标记是否接受校验
     4         public bool Value
     5         {
     6             get { return this.value; }
     7             set { this.value = value; }
     8         }
     9 
    10         public AttributeProperty(bool value)
    11         {
    12             this.Value = value;
    13         } 
    14 
    15     }
    View Code

       然后我们在需要校验的类属性上添加标记。

    private string authorisation;
    [XmlElement(ElementName = "Authorisation")]//第0个特性标记//第1个标记 
    [AttributeProperty(false)] //第1个特性标记 //第0个标记
    public string Authorisation
     {
       get { return authorisation; }
       set { authorisation = value; }
      }

        这里需要解释一下,注释中标有第0个标记,和第1个标记,我也是在调试中发现,当你在属性上添加特性的时候,公共语言运行时会自动根据给你添加的特性排序,为了好理解我把它叫做就近原则,离属性进的就排在前面,从0开始,这样大家应该明白我注释的意思了吧。   

    这里需要重新解释下,犯了一个低级错误,如果添加特性,是根据从上到下排序的,这也是我在后面调试发现的,并不是我前面说的就近原则。大家不要被我误导了。知错就改还算个好孩子。哈哈

    [AttributeProperty(false)]这一段小代码,就是我们自定义的Attribute类,然后在通过反射,判断属性的特性标记是否需要校验。

    对于获取字段属性通过反射,代码如下:
    Type type = obj.GetType();
    PropertyInfo[] ptys = type.GetProperties();
    for (int ptIndex = 0; ptIndex < ptys.Length; ptIndex++)
    {
        object[] arry = ptys[ptIndex].GetCustomAttributes(false);
        if (arry.Length > 1)
        {
           //如果自定义属性值为false,不校验
           if ((ptys[ptIndex].GetCustomAttributes(false)[0] as AttributeProperty).Value == false)
            {
                 continue;
             }
           }
          else if (ptys[ptIndex].GetValue(obj, null) == null || ptys[ptIndex].GetValue(obj, null).ToString() == "")
            {
                 //为空字段存入list集合
                  listFiled.Add(ptys[ptIndex].Name);
             }
    }

     

       上面这段代码有点偷懒了,对于获取的特性没有做很好的控制,通过反射获取属性的特性标记,如果为true,进行非空判断,如果为false就不进行非空判断。

       以上文字仅属于个人笔记,记录。如有雷同纯属巧合,如果侵犯您的什么权利,联系我……

       转载请注明出处。

       

  • 相关阅读:
    268. Missing Number
    217. Contains Duplicate
    189. Rotate Array
    Two Sum II
    122. Best Time to Buy and Sell Stock II
    169. Majority Element
    C# ConfigurationManager不存在问题解决
    C# sqlhelper
    C#基础
    数据库事务日志已满的解决办法
  • 原文地址:https://www.cnblogs.com/stoneWl/p/6549673.html
Copyright © 2011-2022 走看看