如何获取枚举的描述信息

方法一:   使用[Display(Name="描述")]特性  

public namespace My.Test.Application
{

    /// <summary>
    /// 定义枚举
    /// </summary>
    public enum ExpendRecordStatusEnum
    {

        /// <summary>
        /// 正常销售
        /// </summary>
        [Display(Name = "正常销售")]
        NormalSale = 4,

        /// <summary>
        /// 退换
        /// </summary>
        [Display(Name = "退换单据")]
        Replacement = 5

    }

    /// <summary>
    /// 枚举帮助
    /// </summary>
    public static class EnumHelper
    {

        /// <summary>
        /// 获得枚举量的Display[name=""]特性
        /// </summary>
        /// <param name="eum"></param>
        /// <returns></returns>
        public static string GetDisplayName(this System.Enum eum)
        {
            var type = eum.GetType(); //先获取这个枚举的类型
            var field = type.GetField(eum.ToString()); //通过这个类型获取到值
            var obj = (DisplayAttribute)field.GetCustomAttribute(typeof(DisplayAttribute)); //得到特性
            return obj.Name ?? "";
        }


    }

    /// <summary>
    /// 枚举测试类
    /// </summary>
    public class TestEnum
    {

        /// <summary>
        /// 获取到字典描述值
        /// </summary>
        /// <returns></returns>
        public string SearchEnumDisplayName()
        {
            return ExpendRecordStatusEnum.NormalSale.GetDisplayName();
        }
    }


}

 

 

方法二:   使用[DisplayName("描述")]特性

注意:在netcore 3.1中无法使用DisplayName特性

 

public namespace My.Test.Application
{

    /// <summary>
    /// 定义枚举
    /// </summary>
    public enum ExpendRecordStatusEnum
    {

        /// <summary>
        /// 正常销售
        /// </summary>
        [DisplayName("正常销售")]
        NormalSale = 4,

        /// <summary>
        /// 退换
        /// </summary>
        [DisplayName("退换单据")]
        Replacement = 5

    }

    /// <summary>
    /// 枚举帮助
    /// </summary>
    public static class EnumHelper
    {

        /// <summary>
        /// 获得枚举量的DisplayName特性
        /// </summary>
        /// <param name="eum"></param>
        /// <returns></returns>
        public static string GetDisplayName(this System.Enum eum)
        {
            var type = eum.GetType(); //先获取这个枚举的类型
            var field = type.GetField(eum.ToString()); //通过这个类型获取到值
            var obj = (DisplayNameAttribute)field.GetCustomAttribute(typeof(DisplayNameAttribute)); //得到特性
            return obj.DisplayName ?? "";
        }


    }

    /// <summary>
    /// 枚举测试类
    /// </summary>
    public class TestEnum
    {

        /// <summary>
        /// 获取到字典描述值
        /// </summary>
        /// <returns></returns>
        public string SearchEnumDisplayName()
        {
            return ExpendRecordStatusEnum.NormalSale.GetDisplayName();
        }
    }


}

 

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

相关文章

  • 良心推荐:最强推荐系统学习路径,入职无悬念

    现如今推荐系统在我们的生活中无处不在,逛淘宝看到的“你可能还喜欢”、网易云的“推荐歌单”等功能都是通过推荐系统进行的推送。信息爆炸的当下,推荐系统在互联网行业得到了广泛的应用,同时也出现了大量岗位,推荐算法人才的稀缺程度水涨船高,薪资水平也十分可观。截至2022年8月4日,推荐系统工程师月平均工资¥30K-50K,对比平均工资¥10.2K高252.8%,即使每个地区薪资情况各有不同,但推荐岗的薪资也至少高于当地平均工资50%。如此好的行业前景和薪资水平吸引了各行各业的人才,但,学习推荐算法真的这么简单吗?信息爆炸同样在学习方面困扰着我们,每年CIKM、KDD、SIGIR上各种作者发布的文章雪花般众多,干货和注水文混杂,我们在学习时很难分辨到底哪篇文章才是自己想要的、谁的方法可以解决我们的问题。造成目前这种情况的原因是有些朋友在初学推荐系统时,没有梳理好这门课程的条理系统,只是在“小鸡啄米”般读论文,无法将各篇论文中的观点通汇贯通,犹如一盘散沙,导致论文虽然读得多,但却越来越糊涂。只读论文也是不够的,在实际工作中,我们需要用算法和代码解决各种各样的问题,只停留在理论层面无法从容应对工作,

  • golang源码分析(7):chan

    首先,我们先看channel的实现是在哪里?在runtime包下面咯,路径为:./src/runtime/chan.go文件中,其中主要的结构体为:/**定义了channel的结构体*/typehchanstruct{qcountuint//totaldatainthequeue队列中的当前数据的个数dataqsizuint//sizeofthecircularqueuechannel的大小bufunsafe.Pointer//pointstoanarrayofdataqsizelements数据缓冲区,存放数据的环形数组elemsizeuint16//channel中数据类型的大小(单个元素的大小)closeduint32//表示channel是否关闭的标识位elemtype*_type//elementtype队列中的元素类型//send和recieve的索引,用于实现环形数组队列sendxuint//sendindex当前发送元素的索引recvxuint//receiveindex当前接收元素的索引recvqwaitq//listofrecvwaiters接收等待队列;由recv

  • Grafana 9 正式发布,更易用,更酷炫了!

    点击关注公众号,Java干货及时送达推荐阅读:SpringCloudAlibaba终于一统江湖!出品|OSC开源社区(ID:oschina2013)Grafana9.0的主要重点是改善Grafana的用户体验,使可观察性和数据可视化更易用也更容易获得。无论是通过Prometheus和Loki可视化查询生成器还是面板和仪表板搜索功能,Grafana9.0都引入了更新的工作流程,使发现和调查数据变得更加容易和直观。要深入了解所有最新功能,可以加入在GrafanaCONline举行的Grafana9.0会议:https://grafana.com/go/grafanaconline/2022/grafana-9-deep-dive/?pg=blog&plcmt=body-txtVisualPrometheus查询生成器尽管PromQL是一种强大的查询语言,但当涉及到编写查询时,它并不是最简单的,也不容易理解它们。对于Prometheus新手来说,开始编写查询可能是令人生畏的。Prometheus的新查询生成器正是为了解决这个问题而建立的。在Grafana9.0中,你将在Explore

  • 预测组织网络安全风险:深度学习法 (CS)

    恶意黑客进行的网络攻击每年都会给组织、政府和个人造成不可弥补的损失。黑客利用在黑客论坛上发现的漏洞进行复杂的网络攻击,因此对这些论坛的探索至关重要。我们提出了一个黑客论坛实体识别框架(HackER)来识别漏洞和漏洞所针对的实体。然后,HackER使用双向长短期记忆模型(BiLSTM)来创建一个预测模型,以预测哪些公司会被漏洞攻击。算法的结果将使用一个手动标记的黄金标准测试数据集进行评估,使用准确度、精度、召回率和F1-score作为指标。我们选择将我们的模型与最先进的经典机器学习和深度学习基准模型进行比较。结果显示,我们提出的HackERBiLSTM模型在F1-score方面优于所有经典机器学习和深度学习模型(79.71%)。这些结果在0.05或更低的水平上对除LSTM以外的所有基准都有统计学意义。初步工作的结果表明,我们的模型可以帮助关键的网络安全利益相关者(如分析师、研究人员、教育工作者)识别一个漏洞针对的是什么类型的业务。原文:Cyberattacksconductedbymalicioushackerscauseirreparabledamagetoorganizations,

  • Python自定义进程名

    一般情况下,我们直接启动python程序后使用ps查看,显示的结果为pytonxxx.py,web类应用使用netstat或ss查看显示为python。太不个性,太一般,很普通。于是乎有那么一群人,他们不满足于定死的名称,锐意进取(好奇吧、也可能是装那啥),张扬个性,于是乎,google到了一个很( )的第三方库—setproctitle。安装方法:1. 源代码编译安装 git clone https://github.com/dvarrazzo/py-setproctitle.git cd py-setproctitle python setup.py build python setup.py install pip install setproctitle复制使用方法:#coding:utf8import setproctitle setproctitle.setproctitle("进程别名")复制效果如下:版权声明:   本文为原创文章,由SainIC创作和发表,版权所有,转载请注明作者及出处!   本文标题是:Python自定义进程名,本文来源地址:

  • 医疗行业面临的网络安全问题与解决方案

    医疗行业是当今最热门、产值最高的行业之一,因此,也成为网络攻击犯罪分子的主要目标之一,近年来医疗行业遭受网络攻击事件接连发生,给医疗行业带来巨大损失。医疗行业需要加强网络安全意识,防御网络攻击刻不容缓。医疗行业最常遇到的网络安全问题1.数据泄露数据泄露是最常见的医疗行业网络安全问题,所有行业中医疗行业的数据泄露概率最高。最常见的数据泄露类型是基于恶意软件的黑客攻击。犯罪黑产团伙将非法获取的医疗数据及医疗记录拿去售卖,从中赚取高额利润。2.内部威胁很多时候由于医院内部人员安全意识的确实,个人设备往往未经加密,还很可能带有可能破坏其所连接网络的恶意病毒或“蠕虫”,使医院网络安全遭受威胁。3.社会工程此类攻击通过社会工程方法实施,能颠覆哪怕最严格的系统。最常见的社会工程方法是网络钓鱼,攻击者利用精心编制的电子邮件诱骗受害者点击恶意链接或输入其口令信息,或者直接下载恶意软件安装到系统中,来肆无忌惮地窃取医疗机构机密信息并破坏网络系统。4.勒索软件勒索软件病毒会锁定系统或文件,除非支付给黑客赎金,否则设备无法使用。危重病人护理需要使用IT系统,如果重症监护过程因勒索软件而陷入停顿,患者生命就会受

  • 我要这金牌有何用:Kaggle 竞赛成绩真能「保送」谷歌、FB 吗?

    编译:参与:李泽南、郑丽慧本文转自:机器之心那些在Kaggle上获得金牌的数据竞赛大神们都找到了好工作吗?现实或许没这么美好。对于初入机器学习领域的人来说,你肯定已经从学长口中、博客文章中、社区帖子里听说过Kaggle的大名。除了大量竞赛以外,Kaggle上也有很多公开的数据集。 有很多Kaggle入门教程都会提到:这是一个在业内拥有很高认可度的竞赛平台,在你的简历中附上Kaggle成绩,会对找工作很有帮助。最近,这一问题在Reddit机器学习板块上引发了热烈讨论。发帖者「u/AlexSnakeKing」辗转反侧:在大家眼中,Kaggle奖项的重量足以让你「走上人生巅峰」。我们经常可以看到各路Kaggle大神的传奇经历,他们有的非常年轻,有的身经百战。而故事的结局通常会是:他们获得了谷歌、Facebook这样科技巨头的青睐。但他也观察了自己在博客上关注的很多Kaggle获奖者,还有一些经常在LinkedIn上联系的获奖者。获奖的几个月后,「朝为田舍郎,暮登天子堂」的故事没有发生,这些获奖者并未出现在谷歌、FaceBook的办公室里,甚至还有一部分人始终处于自由职业者的状态……这正是令「

  • 【干货】NumPy入门深度好文 (下篇)

    接着上篇继续后面两个章节,数组变形和数组计算。4数组的变形本节介绍四大类数组层面上的操作,具体有重塑(reshape)和打平(ravel,flatten)合并(concatenate,stack)和分裂(split)重复(repeat)和拼接(tile)其他操作(sort,insert,delete,copy)4.1重塑和打平重塑(reshape)和打平(ravel,flatten)这两个操作仅仅只改变数组的维度重塑是从低维到高维打平是从高维到低维重塑用reshape()函数将一维数组arr重塑成二维数组。arr=np.arange(12) print(arr) print(arr.reshape((4,3)))复制[01234567891011] [[012] [345] [678] [91011]]复制思考:为什么重塑后的数组不是[[048] [159] [2610] [3711]]复制当你重塑高维矩阵时,不想花时间算某一维度的元素个数时,可以用「-1」取代,程序会自动帮你计算出来。比如把12个元素重塑成(2,6),你可以写成(2,-1)或者(-1,6)。print(arr.re

  • 作为高级开发者,不懂Chrome这些调试技巧,脸红。

    对于每个前端从业者来说,除了F5键之外,用的最多的另外一个键就是F12了。最近大神(@小鱼二)推荐我一个网站,才知道chrome还有各种骚姿势。这个网站是:umaar.com/dev-tips/,本文分享一些实用且聪明的调试技巧。 1、曾经,在线调伪类样式困扰过你? 2、源代码快速定位到某一行!ctrl+p 3、联调接口失败时,后台老哥总管你要response? 4、你还一层层展开dom?Alt+Click 5、是不是报错了,你才去打断点? 6、你是不是经常想不起来,在哪绑定事件的? 7、你是不是打断点时还要去改代码?8、看dom层级的最直观的方式? 9、查一些特定的请求,过滤器用过吗? 10、在Elements面板调整dom结构很不方便? 11、想知道,某图片加载的代码在哪?Initiator!! 12、不想加载某个文件了? 多的就不列举了,可以看看开头的网站。看了有几个功能我电脑(win10)是没有的,应该跟chrome版本有关。

  • Feathers 2.0 — 面向未来的最简实时开发框架

    介绍Feathers2.0是一款灵活的、实时的JavaScript框架,它使用Express作为服务端,可以使用浏览器和ReactNative作为独立客户端。特性现代、稳健、100%JavaScriptFeathers使用promises和ES6构建,所以你可以使用JavaScript的最新特性并且编写简练优雅的代码。Feathers本身只有几百行的代码,它融洽地包裹了Express,Socket.io和Primus,这些框架都已经被数千家公司使用。 Universal—通用平台FrameworkFriendly—友好的框架ServiceOriented—面向服务端InstantReal-timeRESTAPIs—实时RESTAPIDatastoreAgnostic—多种兼容的数据存储IncrediblyPluggable—丰富的插件 资源官方主页:http://feathersjs.com/官方文档:http://docs.feathersjs.com/index.html发布介绍:https://blog.feathersjs.com/introducing-feathers-2-

  • Vue Router中router.addRoute添加子路由的用法

    新版VueRouter中用router.addRoute来替代原有的router.addRoutes来动态添加路由、子路由 在添加子路由的时候 比如原现有路由 constroutes=[ { path:'/', name:'Login', component:()=>import(/*webpackChunkName:"about"*/'@/views/Login.vue') }, { path:'/index', name:'index', meta:{title:'首页',noCache:true}, component:()=>import(/*webpackChunkName:"about"*/'@/views/index.vue'), children:[] //children:[{ //path:'/test', //name:'test', //component:()=>import('../views/test.vue') //} //] } ] 想要在index下动态添加子路由test,特别要注意添加的子路由的path一定要把父路由的路径也带

  • 简单的Verilog测试模板结构

    这里记录一下曾经用到的简单的测试模板,如下所示: //timescale `timescale1ns/1ns moduletb_module(); //theInternalmotivationvariable(register)andoutputwire //theExternalmotivationstoragevariable //Submodulesignal,example:wire[1:0]xxx==xxx_inst.xxx_inst.xxx; //Globalvariableinitialization,suchas'clk'、'rst_n' initialbegin #0rst_n=0; clk=0; #25rst_n=1; end //Internalmotivationvariableinitialization //initialbegin //end //cloclksignalgeneration always#10clk=~clk; //Casesofsubmodulexxxxxxxx_inst(.(),.(),...,.()); //

  • 原型模式 - OK

      原型模式(Prototype),用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。   简单说来原型模式就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节。   原型模式UML图:        原型模式的基本代码结构: namespaceConsoleApplication1 { abstractclassPrototype { privatestringid; publicPrototype(stringid) { this.id=id; } publicstringId { get{returnid;} } publicabstractPrototypeClone();//抽象类的关键就是要有这样一个克隆方法 } //具体原型类 classConcretePrototype1:Prototype { publicConcretePrototype1(stringid):base(id) { } publicoverridePrototypeClone() { return(Prototype)this.MemberwiseClo

  • Linux命令——lspci

    参考:7LinuxlspciCommandExamplestoGetPCIBusHardwareDeviceInfo 简介 lspci可以看成“ls”+“pci”。lspci会显示出服务器PCI总线上所有信息,除了总线相关的信息,PCI上面挂载的设备(eg网卡、声卡、RAID控制器等)信息也会显示。最小化安装Linux的话可能没有这个命令。 CentOS下安装 yuminstallpciutils复制 Ubuntu下安装 apt-getinstallpciutils复制 参数 -n:以数字方式显示PCI厂商和设备代码; -t:以树状结构显示PCI设备的层次关系,包括所有的总线、桥、设备以及它们之间的联接; -b:以总线为中心的视图; -d:仅显示给定厂商和设备的信息; -s:仅显示指定总线、插槽上的设备和设备上的功能块信息; -i:指定PCI编号列表文件,而不使用默认的文件; -m:以机器可读方式显示PCI设备信息。复制  

  • NoSql中的B-tree、B+tree和LSM-tree 分类: B7_HBASE 2015-03-15 18:27 85人阅读 评论(0) 收藏

    总结: 1、B+树将数据完全排序,读数据时很快,但当要修改数据时,就需要将新入数据下面的数据重新排位,特别是当写入的数据排在较高的位置时,需要大量的移位操作才能完成写入。 2、SLM牺牲部分的读性能,从而提高写性能:将数据分散到多个有序列表中,每个列表保存一部分数据,这样读取数据时,就需要先查找在哪个有序列表,再从这个列表中读取具体数据,但是写的时候,受影响的数据就会减少,从而减少写入时间。 有以下2种方法优化读取时间: (1)Bloomfilter:就是个带随即概率的bitmap,可以快速的告诉你,某一个小的有序结构里有没有指定的那个数据的。于是我就可以不用二分查找,而只需简单的计算几次就能知道数据是否在某个小集合里啦。效率得到了提升,但付出的是空间代价。 (2) 小树合并为大树:也就是大家经常看到的compact的过程,因为小树他性能有问题,所以要有个进程不断地将小树合并到大树上,这样大部分的老数据查询也可以直接使用log2N的方式找到,不需要再进行(N/m)*log2n的查询了。 首先来回答一个问题:为什么在磁盘中要使用b+树来进行文件存储呢? 原因还是因为树的高

  • 自动生成LR脚本且运行

    背景:作为一个测试,特别是性能测试,尤其在活动的测试,时间紧,有很多要测的,我们的LR11因为浏览器兼容问题全录制不了脚本了,用浏览器加代理或手机加代理录制,我感觉好麻烦,所以就想如果能用脚本把所有的测试请求,全部自动生成脚本拿来直接用,岂不是爽歪歪。 最近我老大,非要我用python。他有个特点,每当我们用哪个东西刚刚上手的时候,他就要求我们再扩展。 所以我们这里的人的特质就是:懂的很多,但是都不精通。 我的urls.txt   我的脚本就是逐行读取URL,然后把action_name\web_url名称、url给取出来,拼出LR脚本的格式,存储在C文件中。 #-*-coding:utf-8-*- ''' @Author:ll @Version:v1.0 @File:ToLR.py @CreateTime:2019-11-28下午5:07 ''' importos,sys #一批URL过来,生成简单的LR脚本 classToLr: defToGetScript(self,fromfile,tofile): forurlinopen(fromfile,'r'): str=

  • 【GDOI2018模拟7.9】期末考试

    题目 分析 如果我们确定最后的成绩公布日期t,那么就可以贪心来求出最小的不愉快度: 首先,那些希望的日期小于t的同学,会产生不愉快度,这个用前缀和可以来处理, 对于课程,我们要将大于t的课程全部拖到t, 可以考虑有A、B操作, 首先我们知道,操作的总数是固定的 当A>=B时,尽量选B会最优,于是,对于将大于t的课程全部用B操作拖到t。 当A<=B时,尽量选A会最优,那么由于A有数量限制,所以剩下的选B。 这些就可以用前缀和来处理(笨菜鸟无知,用了权值线段树)。 这个贪心的时间复杂度为O(1)。 所以枚举t即可。 另: 由于t的最优值为单峰函数,也可以用三分。 #include<cmath> #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<queue> constlonglongmaxlongint=2147483647; constint

  • NX9.0和NX10.0做自定义操作可以用的函数

    NX9.0:LIBUFUNX.DLL intUF_OPER_ask_check_geom(void*,int*,unsignedint**) intUF_OPER_ask_first_oper(unsignedint*) intUF_OPER_ask_last_oper(unsignedint*) intUF_OPER_ask_next_oper(unsignedint,unsignedint*) intUF_OPER_ask_oper_tag(void*,unsignedint*) intUF_OPER_ask_part_geom(void*,int*,unsignedint**) intUF_OPER_ask_prev_oper(unsignedint,unsignedint*) intUF_OPER_ask_tool(unsignedint,unsignedint*) intUF_OPER_ask_tool_path(unsignedint,unsignedint*) intUF_OPER_copy(unsignedint,char*,unsignedint*) intUF_O

  • PHP的strtotime()函数2038年bug问题

    最近在开发一个订单查询模块的时候,想当然的写了个2099年的日期,结果PHP返回了空值,肯定是发生溢出错误了,搜索了网上,发现下面这篇文章,但是我的问题依然没有解决,要怎么得到2038年以后的时间戳呢? 我综合了网上的资料,写了以下测试代码,应该可以解决这个问题了: 我的测试环境是:Win764位,PHP环境是:PhpStudyPHP5.5n   <?php echo'PHP中正整形常量的最大值【PHP_INT_MAX】:'.PHP_INT_MAX.'<br>'; echo'PHP_INT_MAX能转换为的最大日期值:'.date("Y-m-dH:i:s",PHP_INT_MAX).'<br>'; echo'<br>'; $date1='1970-01-0108:00:00'; echo'1970-01-0108:00:00时间戳:->'.strtotime($date1).'<br>'; ///////////////////////////////////////////////////////////

  • codeforces 55d 数位dp(整除问题)

    Beautifulnumbers 题意:求lr区间多少个数满足能整除数位上面所有的数(不包括0) 思路:数位dp,看到这个首先想到的是枚举模数,因为1-99个数的lcm只有2520,而且只有48个因子,dp[pos][v][now][mod],mod表示枚举的模数,v表示当前位%mod的值(这里有疑问的可以先看一下bzoj1799),now表示当前位出现的数的lcm,最后v==0&&now==mod的时候表示可行,但是内存一直超,即使把now和mod2维hash一下优化到48*48,内存也要900m,如果把mod一维去掉的话,每次枚举mod的时候都要初始化dp,显然会超时。这里可以固定mod,而不是枚举,固定mod为2520,即1-9的lcm,每次只保留当前数模mod的值,最后判断v%now==0即表示可行,因为mod很小,所以保证了时间和空间上都可以过去,这里可以固定mod的原因是,now一定是mod的因子,也就是说,所以最后的余数是不会影响这个数是不是now的倍数 AC代码: #include"iostream" #include"iomanip" #includ

  • uva12489 Combating cancer(树同构)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——byfraud   https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3933 给你两棵无根树,让你判断这两棵树是否同构 不会判断树同构,果断抄了个模板,乱搞给过掉了。 首先由于给的是无根树,而要判断无根树是否同构得以重心为根,然后做一个括号序列的哈希。 于是我们需要先找出重心,要找树的重心得先知道直径。 找出直径,直径上的点的个数是偶数,那么重心是中间的两个点,如果是奇数个,那么重心是中间那个。 或者说是根据拓排,每次度数为1的点入队,留下的最后一批就是。 然而我当时脑抽了一下,求好直径,后用第二种再去搞。。。其实求直径的时候保存一下路径就好了。 最后,如果有两个重心就做两次哈希,得到两个哈希值,一个就一

相关推荐

推荐阅读