详解C# 枚举高级用法之Description

目录
  • 基础枚举
  • 高级点用法,反射元数据

基础枚举

namespace TestEnum
{
    //声明
    public enum Name
    {
    //默认值 boob = 0 ,依次往下排,可自定义 jackMa = 3,jackCHan那就= 4
        boob,
        JackMa,
        JackChan,
        //
        Lisa,
        Poro
    }
}

声明枚举,调用。
几个常用的转换不做介绍,一嗦一大堆。

  • enum转string
  • enum 转int
  • string转enum
  • 整型转enum

高级点用法,反射元数据

    public enum Name
    {
        [Description("鲍勃")]
        boob,
        [Description("马宇")]
        JackMa,
        [Description("陈龙")]
        JackChan,
        [Description("丽莎")]
        Lisa,
        [Description("保罗")]
        Poro
    }

加了Description,就可以通过反射来访问这些数据

如何访问?

using System;
using System.ComponentModel;
namespace TestEnum
{
    //基础枚举
    public enum Name
    {
        [Description("鲍勃")]
        boob,
        [Description("马宇")]
        JackMa,
        [Description("陈龙")]
        JackChan,
        [Description("丽莎")]
        Lisa,
        [Description("保罗")]
        Poro
    }
    //主要这个GetDescription()方法,看不懂没关系,如何调用
    static class EnumExtensions
    {
        public static string GetDescription(this Enum val)
        {
            var field = val.GetType().GetField(val.ToString());
            var customAttribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute));
            return customAttribute == null ? val.ToString() : ((DescriptionAttribute)customAttribute).Description;
        }
    }
}

调用

string str =  Name.boob.GetDescription();
//需要调用的地方调用

一个特性不够,能再加一个吗?
可以
加一个继承自Attribute 的类

    public class DataTest : Attribute
    {
        public string Data { get; set; }
        public DataTest(string data)
        {
            Data = data;
        }
        public DataTest(){}
    }

加完了自定义特性后你就会发现可以加了。。

   [Description("鲍勃")]
        [DataTest("中文3级")]
        boob,
        [Description("马宇")]
        [DataTest("中文2级")]
        JackMa,
        [Description("陈龙")]
        [DataTest("中文1级")]
        JackChan,
        [Description("丽莎")]
        [DataTest("中文2级")]
        Lisa,
        [Description("保罗")]
        [DataTest("中文2级")]
        Poro

就变成了这样
访问也得加一个

        public static string GetData(this Enum val)
        {
            var field = val.GetType().GetField(val.ToString());
            var customAttribute = Attribute.GetCustomAttribute(field, typeof(DataTest));
            return customAttribute == null ? val.ToString() : ((DataTest)customAttribute).Data;
        }

调用

 string str = Name.boob.GetDescription();
 string DStr = Name.boob.GetData();

以上就是enum 加+自定义特性
不够可以随时自己加。
可以测试玩玩,据说反射浪费资源。

完整代码

using System;
using System.ComponentModel;
namespace TestEnum
{
    //基础枚举
    public enum Name
    {
        [Description("鲍勃")]
        [DataTest("中文3级")]
        boob,
        [Description("马宇")]
        [DataTest("中文2级")]
        JackMa,
        [Description("陈龙")]
        [DataTest("中文1级")]
        JackChan,
        [Description("丽莎")]
        [DataTest("中文2级")]
        Lisa,
        [Description("保罗")]
        [DataTest("中文2级")]
        Poro
    }
    public class DataTest : Attribute
    {
        public string Data { get; set; }
        public DataTest(string data)
        {
            Data = data;
        }
        public DataTest(){}
    }

    static class EnumExtensions
    {
        public static string GetDescription(this Enum val)
        {
            var field = val.GetType().GetField(val.ToString());
            var customAttribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute));
            return customAttribute == null ? val.ToString() : ((DescriptionAttribute)customAttribute).Description;
        }
        public static string GetData(this Enum val)
        {
            var field = val.GetType().GetField(val.ToString());
            var customAttribute = Attribute.GetCustomAttribute(field, typeof(DataTest));
            return customAttribute == null ? val.ToString() : ((DataTest)customAttribute).Data;
        }
    }
}

PS:可以声明obect类型Attribute.子类。 那。。。。。可发挥空间就大了。

到此这篇关于详解C# 枚举高级用法之Description的文章就介绍到这了,更多相关C# 枚举内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C# 枚举的使用简介

    枚举这个名词大家都听过,很多小伙伴也使用过, 那么枚举在开发中能做什么,使用它后能给程序代码带来什么改变,为什么用枚举. 各位看官且坐下,听我一一道来. 为什么使用枚举? 1.枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值. 2.枚举使代码更易于维护,有助于确保给变量指定合法的.期望的值. 3.枚举使代码更易输入和读取. 枚举有哪些用法? 1.简单枚举 2.标志枚举 1.简单枚举 枚举使用enum关键字来声明,与类同级.枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符.

  • C# 实现枚举转列表

    今天有朋友问我,ComboBox 怎么绑定一个 Enum,其实他的意思是枚举如何转换为列表.想想这确实是一个挺正常的需求,但我一时也只想到遍历,他觉得麻烦,于是我在网上帮忙查了一下,提取了三个方法,后来在常用代码工具库也看到一个方法,所以总共四个方法,分为两组,功能可以说都是一样的,就是形式不同,现在分享给大家. #region 获取枚举列表 /// <summary> /// 通过枚举对象获取枚举列表 /// </summary> /// <typeparam name=&

  • 简述C#枚举高级战术

    文章开头先给大家出一道面试题: 在设计某小型项目的数据库(假设用的是 MySQL)时,如果给用户表(User)添加一个字段(Roles)用来存储用户的角色,你会给这个字段设置什么类型?提示:要考虑到角色在后端开发时需要用枚举表示,且一个用户可能会拥有多个角色. 映入你脑海的第一个答案可能是:varchar 类型,用分隔符的方式来存储多个角色,比如用 1|2|3 或 1,2,3 来表示用户拥有多个角色.当然如果角色数量可能超过个位数,考虑到数据库的查询方便(比如用 INSTR 或 POSITION

  • C# 解决在Dictionary中使用枚举的效率问题

    使用字典的好处 System.Collections.Generic命名空间下的Dictionary,它的功能非常好用,且功能与现实中的字典是一样的. 它同样拥有目录和正文,目录用来进行第一次的粗略查找,正文进行第二次精确查找.通过将数据进行分组,形成目录,正文则是分组后的结果.它是一种空间换时间的方式,牺牲大的内存换取高效的查询效率.所以,功能使用率查询>新增时优先考虑字典. public static Tvalue DicTool<Tkey, Tvalue>(Tkey key, Di

  • C# 枚举类型的声明和使用

    目录 前言 相关介绍 一.枚举声明 二.声明位置 三.枚举使用 总结 前言 学习记录下枚举的声明和使用,枚举可用来规范开发 文章中代码的项目名为Project1,C#类名为Class1 相关介绍 微软官方C#函数文档 一.枚举声明 声明的方式:enum [枚举名] {值1, 值2, ..., 值n} 对于最后一个值,逗号可以写,也可以不写对于文字,值不需要使用引号引起来 enum Gender { 男, 女 } 二.声明位置 可以声明在namespace命令空间内 using System; u

  • 详解C# 枚举高级用法之Description

    目录 基础枚举 高级点用法,反射元数据 基础枚举 namespace TestEnum { //声明 public enum Name { //默认值 boob = 0 ,依次往下排,可自定义 jackMa = 3,jackCHan那就= 4 boob, JackMa, JackChan, // Lisa, Poro } } 声明枚举,调用. 几个常用的转换不做介绍,一嗦一大堆. enum转string enum 转int string转enum 整型转enum 高级点用法,反射元数据 publ

  • 详解javascript replace高级用法

    在前端与后台交互的时候我们通常都需要将后台传递的数据绑定到html中,这个绑定数据的方式我们通常是使用jQuery或者使用原生的innerHTML进行绑定,当然也可以使用artTemplate模板来绑定数据,那么artTemplate模板它绑定数据的原理是什么呢?其实它就是利用了replace()方法. 对于正则replace约定了一个特殊标记符"$": 1).$i(i取值范围1~99):表示从左到右正则子表达式所匹配的文本 2).$&:表示与正则表达式匹配的全部文本 3).$

  • 详解C#枚举高级战术

    文章开头先给大家出一道面试题: 在设计某小型项目的数据库(假设用的是 MySQL)时,如果给用户表(User)添加一个字段(Roles)用来存储用户的角色,你会给这个字段设置什么类型?提示:要考虑到角色在后端开发时需要用枚举表示,且一个用户可能会拥有多个角色. 映入你脑海的第一个答案可能是:varchar 类型,用分隔符的方式来存储多个角色,比如用 1|2|3 或 1,2,3 来表示用户拥有多个角色.当然如果角色数量可能超过个位数,考虑到数据库的查询方便(比如用 INSTR 或 POSITION

  • 详解Django admin高级用法

    使用Django意味着后台框架的几乎所有内容都会和Django产生互动,排除功能全部手撸的情况. Django 后台admin有大量的属性和方法,拥有强大的功能和自定义能力.通过完整的代码来看Django admin的基础设置和高级用法,并结合form表单来实现深度自定义. 简单使用 如果只是使用admin自带的数据管理功能,只需要将模型注册到admin中,就可以实现. from django.contrib import admin admin.site.register(News) admi

  • 详解Python3 pandas.merge用法

    摘要 数据分析与建模的时候大部分时间在数据准备上,包括对数据的加载.清理.转换以及重塑.pandas提供了一组高级的.灵活的.高效的核心函数,能够轻松的将数据规整化.这节主要对pandas合并数据集的merge函数进行详解.(用过SQL或其他关系型数据库的可能会对这个方法比较熟悉.)码字不易,喜欢请点赞!!! 1.merge函数的参数一览表 2.创建两个DataFrame 3.pd.merge()方法设置连接字段. 默认参数how是inner内连接,并且会按照相同的字段key进行合并,即等价于o

  • Node.js API详解之 assert模块用法实例分析

    本文实例讲述了Node.js API详解之 assert模块用法.分享给大家供大家参考,具体如下: Node.js API详解之 assert assert 模块提供了断言测试的函数,用于测试不变式. 断言是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真, 可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言. 同样,程序投入运行后,最终用户在遇到问题时可以重新启用断言. 使用断言可以创建更稳定.品质更好且不易于出错的代码. 当需要在一个值为

  • 详解Java枚举类在生产环境中的使用方式

    目录 前言 使用 1.确定业务场景状态 2.定义枚举类 3.自定义查询方法 4.测试效果 总结 前言   Java枚举在项目中使用非常普遍,许多人在做项目时,一定会遇到要维护某些业务场景状态的时候,往往会定义一个常量类,然后添加业务场景相关的状态常量.但实际上,生产环境的项目中业务状态的定义大部分是由枚举类来完成的,因为更加清晰明确,还能自定义不同的方法来获取对应的业务状态值,十分方便. 以下代码均为生产环境已上线项目的代码片段,仅供参考. 使用 大体分为确定业务场景状态.定义枚举类.自定义查询

  • linux 详解useradd 命令基本用法

    linux 详解useradd 命令基本用法 概要: 在 Linux 中 useradd 是个很基本的命令,但是使用起来却很不直观.以至于在 Ubuntu 中居然添加了一个 adduser 命令来简化添加用户的操作.本文主要描述笔者在学习使用 useradd 命令时的一些测试结果. 说明:本文中的所有试验都是在 Ubuntu14.04 上完成. 功能 在Linux中 useradd 命令用来创建或更新用户信息. useradd 命令属于比较难用的命令 (low level utility for

  • Struts2单选按钮详解及枚举类型的转换代码示例

    本文研究的主要是Struts2框架单选按钮详解及枚举类型的转换的相关示例,具体如下. 使用struts2标签,毫无疑问要先引入标签库: <%@ taglib prefix="s" uri="/struts-tags"%> 假设radio单选框中List的值为一个Map集合: <s:radio list="#{'MAN':'男','WOMEN':'女'}" name="gender" listKey="

  • 详解Sed命令的用法与正则表达式元字符

    sed命令用法 sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为『模式空间』(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到文件末尾.文件内容并没有改变,除非你使用重定向存储输出.sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等. 1.简介 sed是非交互式的编辑器.它不会修改文件,除非使

随机推荐