特性Attribute的简单用法

一、建立一个自定义的Attribute类

注:类名+Attribute,类需要继承Attribute

  

    /// <summary>
    /// 特性
    /// </summary>
    public class SensitiveFileTypeAttribute : Attribute
    {
        /// <summary>
        /// 字段类型
        /// </summary>
        public SensitiveFileTypeEnum FileType { get; set; }

        public SensitiveFileTypeAttribute(SensitiveFileTypeEnum fileType)
        {
            FileType = fileType;
        }

    }

    /// <summary>
    /// 字段类型枚举
    /// </summary>
    public enum SensitiveFileTypeEnum
    {

        /// <summary>
        /// 单价
        /// </summary>
        Price = 1,
        /// <summary>
        /// 金额
        /// </summary>
        Amount = 2,
        /// <summary>
        /// 折扣
        /// </summary>
        Discount = 3

    }

  二、简单在属性上面使用特性:

    属性上面标注特性:[特性名(特性值)]

public class SaleSoDtlDto
    {
        /// <summary>
        /// 数量
        /// </summary>
        public int Qty { get; set; }

        /// <summary>
        /// 折扣
        /// </summary>
        [SensitiveFileType(SensitiveFileTypeEnum.Discount)]
        public decimal Discount { get; set; }

    
        /// <summary>
        /// 未税本币结算价
        /// </summary>
        [SensitiveFileType(SensitiveFileTypeEnum.Price)]
        public decimal SettlementPrice { get; set; }
           

        /// <summary>
        /// 含税本币结算金额
        /// </summary>
        [SensitiveFileType(SensitiveFileTypeEnum.Amount)]
        public decimal TaxSettlementAmount { get; set; }
         

    }

  

三、获取某一个类上面有某特性的所有属性:

    /// <summary>
    /// 导出敏感字段
    /// </summary>
    public static class SensitiveFileAppService
    {
        /// <summary>
        /// 使用反射找出某一个类有标记某特性的属性
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public static List<PropertyInfo> GetSensitiveFileList<T>() where T : class, new()
        {
            List<PropertyInfo> proList = new List<PropertyInfo>();

            var properties = typeof(T).GetProperties();
            if (properties == null || !properties.Any()) return proList;

            foreach (PropertyInfo p in properties)
            {
                var name = p.Name;//属性名称

                var attribute = p.GetCustomAttribute<SensitiveFileTypeAttribute>();
                if (attribute == null) continue;  //当前属性是否有SensitiveFileTypeAttribute特性 为NULL就没有此属性

                var fileType = attribute.FileType;//特性的FileType属性值

                proList.Add(p);

            }

            return proList;

        }

    }

  

 public void TestWay()
        {

            var proList = SensitiveFileAppService.GetSensitiveFileList<SaleSoDtlDto>();
        }

  

本文转载于网络 如有侵权请联系删除

相关文章

  • 发送信号控制 nginx「建议收藏」

    大家好,又见面了,我是全栈君。目录修改配置滚动日志文件在运行中升级可执行文件可通过发送信号给nginx进行控制。nginx主进程的PID默认被写入/usr/local/nginx/logs/nginx.pid。 pid文件的路径被可在配置时修改,使用pid指令指定其他路径。nginx主进程支持如下信号:TERM,INT快速关闭nginx QUIT优雅地关闭nginx HUP修改配置,keepingupwithachangedtimezone(onlyforFreeBSDandLinux), 以新配置启动新的worker进程,优雅地关闭老的worker进程。 USR1重新打开日志文件 USR2升级可执行文件 WINCH优雅地关闭worker进程复制也可发送信号给某个worker进程,支持的信号有:TERM,INT快速关闭nginx QUIT优雅地关闭nginx USR1重新打开日志文件 WINCH为调试bug,非正常地关闭worker进程(需在配置中使用debug_points指令)复制修改配置滚动日志示例:cd到日志目录:[root@lamp1nginx]#cd/var/log/ngi

  • 数据结构与算法-最小生成树之普里姆(Prim)算法

    算法步骤Prim算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中,算法从某一个顶点开始,逐渐长大覆盖整个连通网的所有顶点。1.初始化U={u0},T={},其中U为一个新设置的顶点的集合,初始U中只含有顶点u0,这里假设在构造最小生成树时,从顶点u0出发;2.对所有点u属于U集合,点v属于(V减U)集合,两点所构成的边(u,v)中,找一条权最小的边(u',v'),将这条边加入到集合T中,将顶点v'加入到集合U中;3.如果U=V,则算法结束,否则重复以上步骤。最后得到最小生成树MinT=<V,T>,其中T为最小生成树的边的集合。算法实例下面是一个无向带权图和对应的邻接矩阵。以下是算法实现#include<iostream> #include<stdlib.h> #definemaxSize100 #defineinfinity65535 usingnamespacestd; typedefstruct{ //存放的顶点 charvnode[maxSize]; //存放边 intedge[max

  • IDEA动态调试(一)——OGNL表达式注入(S2-001)

    一、环境搭建:首先在IDEA中搭建调试环境,File-New-JavaEnterprise,选择WebApplication:然后构造项目,这里使用现成的Demo代码:依次新建web.xml:复制<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://xmlns.jcp.org/xml/ns/javaee"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"id="WebApp_ID"version="3.1"><display-name>S2-001Example</display-na

  • 中国联通CTO范济安:中国联通大数据发展与规划

    <数据猿导读>中国联通CTO范济安在2016年中国通信大数据大会上发表了以“中国联通大数据发展与规划”为主题的演讲。范济安表示,中国联通的大数据发展大致可以分为三个阶段。目前所面临的挑战,主要是怎样保证大数据充分应用的同时,转化到更好的对外发展能力数据猿报道,2016年4月20-21日,2016中国信息大数据通信大数据大会在京召开。大会以“开放共享、转型创新”为主题,聚焦通信业大数据产业生态,邀请工信部、院士专家、三大运营商集团及省市大数据相关业务部门领导以及领先的大数据产业领军企业及应用单位代表出席,共同探讨通信业大数据发展带来的产业机遇和挑战。本次大会主要针对前沿ICT技术与解决方案对运营商大数据能力建设的提升以及业务运营、架构的转型影响,通信业大数据的开放应用以及开放、共享、创新的产业生态等热点话题展开讨论,全景展现运营商大数据能力建设规划与开放应用策略。本文由“135编辑器”提供技术支持以下是数据猿现场独家直播“中国联通信息化部副总经理&CTO范济安”的发言实录:范济安:尊敬的季社长、闻司长,各位领导、各位嘉宾:大家早上好!非常荣幸,有机会在这里与大家分享中

  • 关于GetDC与GetWindowDC

    关于GetDC与GetWindowDCGetDc函数:用于获得hWnd参数所指定窗口的客户区域的一个设备环境。所获得的设备环境可以是通用、类或者私有类型,具体由指定窗口的类风格决定。对于通用设备环境,GetDc函数每次获取一个设备环境时都会用默认属性对它进行初始化。该函数获得的类和私有设备环境会与它们最后一次的设置保持一致。当设备环境不再需要时,应该调用ReleaseDC函数将其释放。    GetWindowDC函数:返回hWnd参数所指定的窗口的设备环境。获得的设备环境覆盖了整个窗口(包括非客户区),例如标题栏、菜单、滚动条,以及边框。这使得程序能够在非客户区域实现自定义图形,例如自定义标题或者边框。当不再需要该设备环境时,需要调用ReleaseDC函数释放设备环境。注意,该函数只获得通用设备环境,该设备环境的任何属性改变都不会反映到窗口的私有或者类设备环境中(如果窗口有的话)ReleaseDC函数 函数功能:函数释放设备上下文环境(DC)供其他应用程序使用。函数的效果与设备上下文环境类型有关。它只释放公用的和设备上下文环境,对于类或私有的则无数。 函数原型:intRelease

  • 内核态和用户态区别的重要性_cpu用户态和内核态区别

    大家好,又见面了,我是你们的朋友全栈君。内核态和用户态区别内核态和用户态区别当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。1、用系统调用时进入核心态。Linux对硬件的操作只能在核心态,这可以通过写驱动程序来控制。在用户态操作硬件会造成coredump. 2、要注意区分系统调用和一般的函数。系统调用由内核提供,如read()、write()、open()等。而一般的函数由软件包中的函数库提供,如sin()、cos()等。在语法上两者没有区别。 3、一般情况:系统调用运行在核心态,函数运行在用户态。但也有一些函数在内部使用了系统调

  • 带你理解MST性质

    写在前面 最小生成树的引出 假设要在n个城市之间建立通信联络网,则连通n个城市需要n-1条线路。在这种情况下,我们自然需要考虑一个问题,如何在最节省经费的条件下建立这个网络? 很自然地我们会想到,将各个城市之间的线路开销转化为权重,要想找到最节省经费的方案,就需要找到能够连通所有城市且权重最小的连通线路。 因此,我们需要选择一颗生成树,使得该生成树总耗费最小,也就是用最小的代价构建这条连通网。我们称这样的网络为:最小代价生成树(简称:最小生成树)。 本文结构 本文从MST性质的定义和证明方面为读者解度最小生成树两个常见算法的前置理论性质。 普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法都是利用了MST性质的算法 建议读者在在理解了普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法之后再阅读此文 利用得到的最小生成树在回过头来理解MST会更加简单。 MST性质 MST性质的定义 假设N=(V,{E})是一个连通网,U是顶点集V的一个非空子集。 若(u,v)是一条既有最小权值(代价)的边,其中u∈U,v∈V,则必存在一颗包含边(u,v)的最小生成树。 证明 证明方法 可以用

  • rman镜像备份

    rman镜像备份 backupascompressedbackupsetdatabase 镜像备份也叫镜像副本,是数据文件或归档日志文件等的完整拷贝,未经过任何压缩等处理,不能备份到磁带,不支持增量。备份恢复时可以立即使用实现快速恢复,等同于操作系统的复制命令。 特点: 类似手工copy,备份所以的块 不支持增量备份 只能存储在磁盘 restore速度块 备份数据库 backupascopydatabaseformat'/tmp/test/%d_%s.bk'; 复制 查看copy备份 RMAN>listcopyofdatabase; 数据文件副本列表 ======================= 关键字文件S完成时间CkpSCNCkp时间稀疏 ------------------------------------------------ 41A15-5月-22485353215-5月-22NO 名称:/tmp/test/ORCL_146.bk 标记:TAG20220515T164350 53A15-5月-22485353715-5月-22NO 名称:/tmp/tes

  • find pattern

    daniel@daniel-mint~/msf/metasploit-framework/tools$rubypattern_create.rb2000 Aa0Aa1Aa2Aa3Aa4Aa5Aa6Aa7Aa8Aa9Ab0Ab1Ab2Ab3Ab4Ab5Ab6Ab7Ab8Ab9Ac0Ac1Ac2Ac3Ac4Ac5Ac6Ac7Ac8Ac9Ad0Ad1Ad2Ad3Ad4Ad5Ad6Ad7Ad8Ad9Ae0Ae1Ae2Ae3Ae4Ae5Ae6Ae7Ae8Ae9Af0Af1Af2Af3Af4Af5Af6Af7Af8Af9Ag0Ag1Ag2Ag3Ag4Ag5Ag6Ag7Ag8Ag9Ah0Ah1Ah2Ah3Ah4Ah5Ah6Ah7Ah8Ah9Ai0Ai1Ai2Ai3Ai4Ai5Ai6Ai7Ai8Ai9Aj0Aj1Aj2Aj3Aj4Aj5Aj6Aj7Aj8Aj9Ak0Ak1Ak2Ak3Ak4Ak5Ak6Ak7Ak8Ak9Al0Al1Al2Al3Al4Al5Al6Al7Al8Al9Am0Am1Am2Am3Am4Am5Am6Am7Am8Am9An0An1An2An3An4An5An6An7An8An9Ao0

  • Googletest源码编译安装

    Googletest源码编译安装 下载源码 gitclone--branchrelease-1.11.0--recursivehttps://github.com/google/googletest 复制 编译安装 mkdirbuild;cdbuild cmake-DCMAKE_INSTALL_PREFIX=<yourgoogletestinstalldir>.. 复制 系统链接 sudoln-s<yourgoogletestinstalldir>/lib/libgtest.a/usr/lib/libgtest.a sudoln-s<yourgoogletestinstalldir>/lib/libgtest_main.a/usr/lib/libgtest_main.a sudoln-s<yourgoogletestinstalldir>/include/gtest/usr/include/gtest 复制

  • 为什么要用kafka、rabbit等消息队列

    1.解耦: 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。 2.冗余: 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的"插入-获取-删除"范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。 3.扩展性: 因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。 4.灵活性&峰值处理能力: 在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见。如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。 5.可恢复性: 系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。 6.顺序保证: 在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据

  • 《程序员的职业素养》不完整的读后记

    第一篇薄博客,文笔差,话题老,将就将就。 最近一个星期的空余时间里读完《程序员的职业素养》,感触比较深,于是就拿这个当话题写了点东西没,顺便推荐一下翻译者之一 余晟 的微信公众号“余晟以为”   【说“不”】最近这几个星期,因为公司里要测的项目都扎堆在一起,我和导师都非常忙碌。后来发现的bug很多,当开发在deadline到来嚷着要上线的时候,导师坚决拒绝,“宁愿延期也要保证质量,绝不能把一个残次品扔上去给别人用”。原话大概是这样,这深深地触动了我。在很多公司里面测试地位都比开发低,这是国内行业的文化。通常测试和开发也是对立的角色,容易起争论导致团队内的不和谐,可能这时候比较没有经验的测试(比如我就是)会在内心说服自己听从开发,安慰自己这是为了团队的和谐和长期发展,就听开发一次吧,开发比自己资格老,自己不该这样顶撞。殊不知开发其实并没有想得像自己以为的那样周全,结果最后锅还得由测试背,因为测试的责任就是在最后把关产品的质量,过了测试这一关就相当于质量已经得到了测试的保证,出事找测试。导师这样做,绝对是对的,不仅在考虑自己身为测试的利益,也考虑了产品用户的体

  • Java Swing+Mysql电影购票系统(普通用户/管理员登录+充值购票+影院管理)

    @目录文章目录数据库连接主要页面运行截图 文章目录 电影购票系统模拟真实购票流程,在线选座,充值购票,影院信息管理。登录用户分为:普通用户+管理员 数据库连接 BaseDao类,建立数据库连接 代码如下: packagedaoimpl; importjava.lang.reflect.Field; importjava.sql.Connection; importjava.sql.DriverManager; importjava.sql.PreparedStatement; importjava.sql.ResultSet; importjava.sql.ResultSetMetaData; importjava.sql.SQLException; importjava.util.ArrayList; importjava.util.List; publicclassBaseDao{ privatestaticfinalStringDRIVER="com.mysql.jdbc.Driver"; privatestaticfinalStringURL="jdbc:mysql

  • spark-yarn

    1. http://blog.cloudera.com/blog/2014/05/apache-spark-resource-management-and-yarn-app-models/ 2. http://blogx.github.io/how-to-tune-your-apache-spark-jobs-part-2.html 3. http://gethue.com/new-notebook-application-for-spark-sql/ 4. http://gethue.com/a-new-spark-web-ui-spark-app/   5.kafka: http://blog.csdn.net/zhongwen7710/article/details/41252649 6.kafka+sparkstreaming:http://blog.csdn.net/ligt0610/article/details/47311771 google: https://www.guge.link tachyon

  • 求和计算器

    packageday46; importjava.awt.*; importjava.awt.event.ActionEvent; importjava.awt.event.ActionListener; importjavax.swing.*; publicclasswindowsimplementsActionListener{ JFramejf; JPaneljp,jp1; JButtonjb1,jb2; JTextFieldjt1,jt2,jt3; JLabeljl,jl1; publicwindows(){ jf=newJFrame("求和"); jp=newJPanel(newGridLayout(2,2,10,10)); jp1=newJPanel(); jl=newJLabel("加数1"); jl1=newJLabel("加数2"); jt1=newJTextField(10); jt2=newJTextField(10); jp.add(jl); jp.add(jt1); jp.add(jl1); jp.add(jt2); jb1=newJButton("求和")

  • docker搭建kafaka

    https://www.cnblogs.com/toov5/p/11406325.html 1,启动zk复制 dockerrun-d--namezookeeper-p2181:2181-twurstmeister/zookeeper复制 启动kafka dockerrun--namekafka01\ -p9092:9092\ -eKAFKA_BROKER_ID=0\ -eKAFKA_ZOOKEEPER_CONNECT=172.17.13.22:2181\ -eKAFKA_ADVERTISED_LISTENERS=PLAINTEXT://172.17.13.22:9092\ -eKAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092\ -dwurstmeister/kafka复制  创建主题 进入到容器中:复制 dockerexec-itkafka01/bin/bash复制 创建主题:my_log 复制 /opt/kafka/bin/kafka-topics.sh--create--zookeeper172.17.13.22:2181

  • 自己写的一个分页函数,可以使用

    <?php /** *DEMO10 *功能:分页 *author:wenzl *分页中心方法DEMO *功能智能提供数字分页 *$page当前页码 *$pageSize每页数据条数 *$dataTotal数据总数 *|$number设置可视分页项数 *|[1][2][3][4][5][6] */ functiongetPage($page=1,$pageSize=5,$dataTotal=100,$number=5){ $pageCnt=ceil($dataTotal/$pageSize);//总页数 $groupCnt=ceil($pageCnt/$number); $k=1; $pageTemp=array(); for($i=1;$i<=$groupCnt;$i++){ if($i==1){ for($j=1;$j<=$number+1;$j++){ $k<=$pageCnt&& $pageTemp[$i][$j]=$k++; } $k--; }else{ for($j=1;$j

  • 将博客搬至CSDN

    将博客搬至CSDN

  • poj-1363Rails

    Rails TimeLimit:1000MS   MemoryLimit:10000K TotalSubmissions:21555   Accepted:8612 Description ThereisafamousrailwaystationinPopPushCity.Countrythereisincrediblyhilly.Thestationwasbuiltinlastcentury.Unfortunately,fundswereextremelylimitedthattime.Itwaspossibletoestablishonlyasurfacetrack.Moreover,itturnedoutthatthestationcouldbeonlyadead-endone(seepicture)andduetolackofavailablespaceitcouldhaveonlyonetrack.   Thelocaltraditionisthateverytrainarrivingfromthedi

  • 论文 END-TO-END OPTIMIZED IMAGE COMPRESSION 源码解析与论文阅读——预处理+分析变换

    目录0前言1预处理1.1读取1.2维度变换2分析变换2.1初始化init()2.2build()2.3call()2.3.1初始化2.3.2零填充2.3.3卷积计算2.3.4加bias2.3.5激活函数GDN(正向) 0前言 关于写这篇文章的背景、相关资源连接、概述,参见这篇文章 1预处理 1.1读取 defread_bmp(filename): """Loadsabmpimagefile.""" string=tf.read_file(filename) image=tf.image.decode_image(string,channels=0) #读取、解码,读入后为二维矩阵 image=tf.cast(image,tf.float32)#转float32类型 image/=255#归一化 returnimage 复制 1.2维度变换 #假设输入矩阵维度为[256,256] x=tf.expand_dims(x,0)#增加了批维度batch[1,256,256] x.set_shape([1,None,None,1])#增加了通道维度channel[1,256,256,1] #到

  • 百家讲坛 大秦崛起(上部)

    来源:央视网 20170921大秦崛起(上部)1星火燎原 http://tv.cctv.com/2017/09/21/VIDE7Wei8t3nsssQIOwrBuAh170921.shtml 20170922大秦崛起(上部)2西周附庸 http://tv.cctv.com/2017/09/22/VIDEOTEdrCkByeR5CpD4z6km170922.shtml 20170923大秦崛起(上部)3西方诸侯 http://tv.cctv.com/2017/09/23/VIDEzdC1Pjboscwp143JwJ4k170923.shtml 20170924大秦崛起(上部)4献公当政 http://tv.cctv.com/2017/09/24/VIDEyjZjXfTTuzdABrftwSKS170924.shtml 20170925大秦崛起(上部)5秦晋交恶 http://tv.cctv.com/2017/09/25/VIDEO2AxXzMGe4L3oMVaNgVh170925.shtml 20170926大秦崛起(上部)6秦晋再好 http://tv.cctv.com/2017/09

相关推荐

推荐阅读