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

背景介绍:最近手头开发了一个功能,航运代理公司运送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就进行校验。

 public class AttributeProperty: System.Attribute
{
private bool value;//标记是否接受校验
public bool Value
{
get { return this.value; }
set { this.value = value; }
} public AttributeProperty(bool value)
{
this.Value = value;
} }

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

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 = ; ptIndex < ptys.Length; ptIndex++)
{
object[] arry = ptys[ptIndex].GetCustomAttributes(false);
if (arry.Length > )
{
//如果自定义属性值为false,不校验
if ((ptys[ptIndex].GetCustomAttributes(false)[] 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就不进行非空判断。

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

转载请注明出处。

关于类属性值校验的一点记录 【知识点Attribute】的更多相关文章

  1. MVC过滤器中获取实体类属性值

    本文地址:http://www.cnblogs.com/outtamyhead/p/3616913.html,转载请保留本地址! 最近在项目遇到了这个问题:获取Action行参中实体类的属性值,主要的 ...

  2. 浅拷贝工具类,快速将实体类属性值复制给VO

    /** * 浅拷贝的工具类 */ public class PropertiesUtil { /** * 两个类,属性名一样的元素,复制成员. */ public static void copy(O ...

  3. python小知识-__call__和类装饰器的结合使用,数据描述符__get__\__set__\__delete__(描述符类是Python中一种用于储存类属性值的对象)

    class Decorator(): def __init__(self, f): print('run in init......') self.f = f def __call__(self, a ...

  4. python面向对象学习(六)类属性、类方法、静态方法

    目录 1. 类的结构 1.1 术语 -- 实例 1.2 类是一个特殊的对象 2. 类属性和实例属性 2.1 概念和使用 2.2 属性的获取机制 3. 类方法和静态方法 3.1 类方法 3.2 静态方法 ...

  5. python类属性和类方法(类的结构、实例属性、静态方法)

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...

  6. python-面向对象-09_类属性和类方法

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...

  7. Python类属性和类方法

    01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两步: 1) 在内存中为对象 分配空间 2) 调用初始化方法 __in ...

  8. Python类的特点 (2) :类属性与实例属性的关系

    测试代码: #encoding:utf-8 class Parent(object): x=1 #x是Parent类的属性(字段) ls=[1,2] #ls是一个列表,也是Parent类的属性(字段) ...

  9. python 类属性和实例属性

    class AAA(): aaa = 10 # 情形1 obj1 = AAA() obj2 = AAA() print obj1.aaa, obj2.aaa, AAA.aaa # 情形2 obj1.a ...

随机推荐

  1. SpringBoot入门篇--对于JSON数据的返回以及处理一

    在后台的开发过程中不可避免的就是一系列对JSON数据的返回,需要我们进行的就是提供各种各样的数据.一般情况下数据类型最常用的就是JSON以及XML,在这里我们就讲讲在SpringBoot里面我们怎样进 ...

  2. Axure RP Extension for Chrome经常损坏

    昨天自己修改后的谷歌浏览器插件,才使用了一天,今天刚打开浏览器就弹出了“已停用不支持的扩展程序”提示,第三方扩展程序就这么不受谷歌浏览器待见呢!?好吧,想办法解决! 通过扩展程序里“该扩展程序未列在 ...

  3. 版本控制器svn详细

    2 svn介绍 2.1 项目管理中的版本控制问题 通常软件开发由多人协作开发,如果对代码文件.配置文件.文档等没有进行版本控制,将会出现很多问题: 备份多个版本,占用磁盘空间大 解决代码冲突困难 容易 ...

  4. eclipse 预览Android界面报错

    This version of the rendering library is more recent than your version of ADT plug-in. Please update ...

  5. (1)activiti认识以及数据库和插件配置

    工作流介绍 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档.信息或任务的过程, 从而实现某个预期的业务目标, ...

  6. 取出资源文件中的bitmap,并将其保存到TMemoryStream中,从资源里载入图象而不丢失调色板

    从资源里载入图象而不丢失调色板 procedure loadgraphic(naam:string);var  { I've moved these in here, so they exist on ...

  7. nginx 配置ajax跨域访问php接口

    在nginx.conf里面,找到server项,并在里面添加如下配置 location ~ \.php?($|/) { #try_files $uri =; #handel cosr by mao a ...

  8. [z]微信平台开发教程

    http://blog.csdn.net/lyq8479?viewmode=contents

  9. oracle删除表空间下所有的表

    SELECT 'DROP TABLE ' || TABLE_NAME || ' CASCADE CONSTRAINTS' V_NAME FROM DBA_TABLES WHERE TABLESPACE ...

  10. Java Thread系列(三)线程安全

    Java Thread系列(三)线程安全 一.什么是线程安全 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. 线程安全来 ...