Attribute小试

  项目需要导入Excel,需要对内容进行效验,但是效验的方式都很简单,主要是判断非空字段和应为数字的字段是否为数字。 因为判断的方式大致相同,逐个字段去判断实在太费劲了,所以想到Attribute,可以用这个来实现。

  首先是Attribute类

  

public class CheckAttribute : Attribute
    {
        /// <summary>
        /// 必填级别 1 必填 2 选填 3为后续设计保留字段
        /// </summary>
        public int NeedType { get; set; }

        /// <summary>
        /// 限制类型 0 为 字符串 1为int
        /// </summary>
        public int ContentType { get; set; }  }

  然后再类中加上对应的特性,其中Name为必填的字符串 Age为必填的Int Addr为非填的字符串

 class TestClass
    {
        [Check(NeedType = 1, ContentType = 0)]
        public string Name { get; set; }

        [Check(NeedType = 1, ContentType = 1)]
        public int Age  { get; set; }

        [Check(NeedType = 2, ContentType = 0)]
        public string Addr { get; set; }
    }

  然后再是验证类

 public class ValidationModel
    {
        public bool Validate(object obj)
        {
            var t = obj.GetType();

            var properties = t.GetProperties();
            foreach (var property in properties)
            {
                if (!property.IsDefined(typeof(CheckAttribute), false)) continue;

                var attributes = property.GetCustomAttributes(typeof(CheckAttribute), false);
                foreach (var attribute in attributes)
                {
                    var needType = (int)attribute.GetType().
                        GetProperty("NeedType").
                        GetValue(attribute);

                    var contentType = (int)attribute.GetType().
                        GetProperty("ContentType").
                        GetValue(attribute);
                    var propertyValue = property.GetValue(obj) as string;
                    //如果该项为必填,但是值为空则返回错误
                    if (needType == 1 && string.IsNullOrWhiteSpace(propertyValue))
                        return false;
                    //如果值类型为int
                    if (contentType == 1)
                    {
                        //非空字段已被排查,因此该属性可为空,值为空可返回正确信息
                        if (string.IsNullOrWhiteSpace(propertyValue))
                            return true;
                        int temp = 0;
                        //如果不能被强制转换为float 则类型不为int 返回错误
                        if (!int.TryParse(propertyValue, out temp))
                        {
                            return false;
                        }
                    }
                }
            }
            return true;
        }
    }

  在这种类似的有大量相似验证的地方,用Attribute的方式比挨个字段去比较的方式省了很多重复代码,代码可读性也更高

时间: 2024-10-26 02:27:56

Attribute小试的相关文章

[小技巧] gcc attribute error 属性小试

gcc __attribute__  里有一个属性是 error 能够用于编译时报错. 參考: https://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Function-Attributes.html error ("message") If this attribute is used on a function declaration and a call to such a functionis not eliminated through de

小试ImageMagik——开发篇

ImageMagick的使用和开发的文章: 小试ImageMagik--使用篇 小试ImageMagik--开发篇 ====================== 本文介绍使用ImageMagick开发程序的方法.ImageMagick安装之后就可以支持C/C++程序的开发,提供了3种接口.在这里首先介绍一下ImageMagick的3种接口. MagickCore: 底层的C语言接口.较复杂,但是可以修改很多参数,只适合高端用户使用. MagickWand: 推荐的C语言接口.相比于MagickC

AttributeError: &#39;module&#39; object has no attribute &#39;dumps&#39;

报错: [[email protected] ~]# ./json.py DATA: [{'a': 'A', 'c': 3.0, 'b': (2, 4)}] Traceback (most recent call last): File "./json.py", line 4, in <module> import json File "/root/json.py", line 8, in <module> data_string = jso

Redis配置以及通过C#访问小试

首先安装一个Ubuntu14.04的虚拟机用来安装Redis.Ubuntu的Unity在虚拟机里面卡爆了,可以通过如下方法安装传统的Gnome界面: sudo aptitude install gnome-session-fallback 安装完成之后可以在登录的地方选择Gnome界面. Redis的编译和安装在Linux下面非常简单,访问redis.io获得稳定版的源代码.现在是redis-2.8.13.tar.gz 下载完成之后,执行如下命令: tar xzf redis-2.8.13.ta

Django admin 中抛出 &#39;WSGIRequest&#39; object has no attribute &#39;user&#39;的错误

这是Django版本的问题,1.9之前,中间件的key为MIDDLEWARE_CLASSES, 1.9之后,为MIDDLEWARE.所以在开发环境和其他环境的版本不一致时,要特别小心,会有坑. 将settings里的MIDDLEWARE_CLASSES默认配置顺序改成如下 MIDDLEWARE_CLASSES = [ 'django.middleware.security.SecurityMiddleware', 'django.middleware.common.CommonMiddlewar

JavaScript中的property和attribute的区别

时间: 2013-09-06 | 10:24 作者: 玉面小飞鱼 分类: DOM, js相关, 前端技术 2,222 次浏览 1. 定义 Property:属性,所有的HTML元素都由HTMLElement类型表示,HTMLElement类型直接继承自Element并添加了一些属性,添加的这些属性分别对应于每个HTML元素都有下面的这5个标准特性: id,title,lang,dir,className.DOM节点是一个对象,因此,他可以和其他的JavaScript对象一样添加自定义的属性以及方

module has no attribute &#39;seq2seq&#39;

tensorflow 中tf.nn.seq2seq.sequence_loss_by_example to tf.contrib.legacy_seq2seq.sequence_loss_by_example tf.nn.rnn_cell. to tf.contrib.rnn. 1.0修改了很多地方,错误可取官网搜索. module has no attribute 'seq2seq'

CVS导出&amp;&amp;自定义Attribute的使用

1.cvs导出:List转为byte[] /// <summary> /// CvsExport帮助类 /// </summary> public static class CvsExportHelper { /// <summary> /// Creates the CSV from a generic list. /// </summary>; /// <typeparam name="T"></typeparam&

javascript中attribute和property的区别详解

DOM元素的attribute和property很容易混倄在一起,分不清楚,两者是不同的东西,但是两者又联系紧密.很多新手朋友,也包括以前的我,经常会搞不清楚. attribute翻译成中文术语为"特性",property翻译成中文术语为"属性",从中文的字面意思来看,确实是有点区别了,先来说说attribute. attribute是一个特性节点,每个DOM元素都有一个对应的attributes属性来存放所有的attribute节点,attributes是一个类数