C#高级:枚举(Enum)从索引、值到注释的完整使用技巧

news2025/1/9 1:28:54

目录

一、推荐的枚举写法

二、获取注释的封装代码

三、已知【枚举】,获取注释、索引

四、已知【索引】,获取枚举值、注释

五、已知【注释】,获取枚举值、索引

六、创建一个【枚举字典】,key=索引,value=(枚举值,注释)

七、全部代码展示(控制台程序)

八、输出结果


一、推荐的枚举写法

 public enum Level
 {
     [Description("无")]
     None = 0,

     [Description("一般")]
     Normal = 1,

     [Description("重要")]
     Important = 2,

     [Description("紧急")]
     Urgent = 3
 }

【不推荐的写法】没有索引值(或者索引值用字符串)、不写注释、命名马虎等

二、获取注释的封装代码

private static string GetEnumDescription(Enum value)
{
    var fieldInfo = value.GetType().GetField(value.ToString());
    var attribute = (DescriptionAttribute)Attribute.GetCustomAttribute(fieldInfo, typeof(DescriptionAttribute));
    return attribute?.Description ?? value.ToString();
}

【说明】有了上述该代码,实现索引、注释、枚举字符串的转化就相当容易了!

三、已知【枚举】,获取注释、索引

 Level enumdata = Level.Important;
 Console.WriteLine($"注释:{GetEnumDescription(enumdata)}");
 Console.WriteLine($"索引:{enumdata.GetHashCode()}");

四、已知【索引】,获取枚举值、注释

  int index = 1;
  Console.WriteLine($"枚举值(Level):{(Level)index}");
  Console.WriteLine($"枚举值(string):{((Level)index).ToString()}");
  Console.WriteLine($"注释(string):{GetEnumDescription((Level)index)}");

五、已知【注释】,获取枚举值、索引

这里需要多封装一个方法,如下所示:

 public static TEnum GetEnumByDescription<TEnum>(string description)
     where TEnum : Enum
 {
     foreach (var field in typeof(TEnum).GetFields(BindingFlags.Public | BindingFlags.Static))
     {
         if (Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) is DescriptionAttribute attribute)
         {
             if (attribute.Description == description)
             {
                 return (TEnum)field.GetValue(null);
             }
         }
     }

     throw new ArgumentException($"枚举类型 {typeof(TEnum).FullName} 中找不到描述为 '{description}' 的枚举成员。");
 }

实现代码:

Level enumresult = GetEnumByDescription<Level>("紧急");
Console.WriteLine($"枚举值:{enumresult}");
Console.WriteLine($"索引值:{enumresult.GetHashCode()}");

六、创建一个【枚举字典】,key=索引,value=(枚举值,注释)

这里需要多封装一个方法,如下所示:

 private static Dictionary<int, (T, string)> GetDictionaryByEnum<T>() where T : Enum
 {
     // 创建一个字典来存储索引和枚举值/注释的对应关系
     Dictionary<int, (T, string)> enumDictionary = new Dictionary<int, (T, string)>();

     // 遍历枚举成员
     foreach (T enumValue in Enum.GetValues(typeof(T)))
     {
         // 获取枚举成员的整数值
         int enumIndex = enumValue.GetHashCode();

         // 获取枚举成员的描述信息(注释)
         string enumDescription = GetEnumDescription(enumValue);

         // 将索引和枚举值/注释的对应关系存入字典
         enumDictionary.Add(enumIndex, ((T)enumValue, enumDescription));
     }
     return enumDictionary;
 }

实现代码:

var dict = GetDictionaryByEnum<Level>();
foreach (var item in dict)
{
    Console.WriteLine($"索引:{item.Key},枚举值:{item.Value.Item1},注释:{item.Value.Item2}");
}

七、全部代码展示(控制台程序)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Xml.Linq;

namespace ConsoleApp1
{

    public class Program
    {
        public static TEnum GetEnumByDescription<TEnum>(string description)
            where TEnum : Enum
        {
            foreach (var field in typeof(TEnum).GetFields(BindingFlags.Public | BindingFlags.Static))
            {
                if (Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) is DescriptionAttribute attribute)
                {
                    if (attribute.Description == description)
                    {
                        return (TEnum)field.GetValue(null);
                    }
                }
            }

            throw new ArgumentException($"枚举类型 {typeof(TEnum).FullName} 中找不到描述为 '{description}' 的枚举成员。");
        }

        private static string GetEnumDescription(Enum value)
        {
            var fieldInfo = value.GetType().GetField(value.ToString());
            var attribute = (DescriptionAttribute)Attribute.GetCustomAttribute(fieldInfo, typeof(DescriptionAttribute));
            return attribute?.Description ?? value.ToString();
        }

        private static Dictionary<int, (T, string)> GetDictionaryByEnum<T>() where T : Enum
        {
            // 创建一个字典来存储索引和枚举值/注释的对应关系
            Dictionary<int, (T, string)> enumDictionary = new Dictionary<int, (T, string)>();

            // 遍历枚举成员
            foreach (T enumValue in Enum.GetValues(typeof(T)))
            {
                // 获取枚举成员的整数值
                int enumIndex = enumValue.GetHashCode();

                // 获取枚举成员的描述信息(注释)
                string enumDescription = GetEnumDescription(enumValue);

                // 将索引和枚举值/注释的对应关系存入字典
                enumDictionary.Add(enumIndex, ((T)enumValue, enumDescription));
            }
            return enumDictionary;
        }

        public enum Level
        {
            [Description("无")]
            None = 0,

            [Description("一般")]
            Normal = 1,

            [Description("重要")]
            Important = 2,

            [Description("紧急")]
            Urgent = 3
        }


        static void Main(string[] args)
        {

            //1.已知【枚举】,获取注释、索引
            Level enumdata = Level.Important;
            Console.WriteLine($"注释:{GetEnumDescription(enumdata)}");
            Console.WriteLine($"索引:{enumdata.GetHashCode()}");

            //
            //2.已知【索引】,获取枚举值、注释
            int index = 1;
            Console.WriteLine($"枚举值(Level):{(Level)index}");
            Console.WriteLine($"枚举值(string):{((Level)index).ToString()}");
            Console.WriteLine($"注释(string):{GetEnumDescription((Level)index)}");

            //3.已知【注释】,获取枚举值、索引
            Level enumresult = GetEnumByDescription<Level>("紧急");
            Console.WriteLine($"枚举值:{enumresult}");
            Console.WriteLine($"索引值:{enumresult.GetHashCode()}");

            //4.创建一个【枚举字典】,key=索引,value=(枚举值,注释)
            var dict = GetDictionaryByEnum<Level>();
            foreach (var item in dict)
            {
                Console.WriteLine($"索引:{item.Key},枚举值:{item.Value.Item1},注释:{item.Value.Item2}");
            }

        }

        
    }

}


八、输出结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1960193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

入选ICML!麻省理工团队基于AlphaFold实现新突破,揭示蛋白质动态多样性

作为生物体的重要组成部分&#xff0c;蛋白质具有不同状态&#xff0c;基于集体运动或无序波动的不同结构组合&#xff0c;采用复杂的三维结构&#xff0c;来执行丰富的生物功能&#xff0c;例如&#xff0c;蛋白质构象变化对转运体、通道和酶的功能至关重要&#xff0c;而平衡…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 围棋的气(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

Oracle特有的DECODE函数

Oracle中的DECODE函数是一种条件表达式函数&#xff0c;用于基于给定的条件从一组值中选择一个值返回。它的基本语法如下&#xff1a; DECODE(expression, search1, result1, [search2, result2, ...], [default])expression&#xff1a;要比较的表达式或列。searchN&#xff…

正点原子imx6ull-mini-Linux驱动之pinctrl 和 gpio 子系统(5)

1&#xff1a;pinctrl 子系统 1.1&#xff1a;pinctrl 子系统简介 Linux 驱动讲究驱动分离与分层&#xff0c;pinctrl 和 gpio 子系统就是驱动分离与分层思想下的产物&#xff0c; 驱动分离与分层其实就是按照面向对象编程的设计思想而设计的设备驱动框架 来回顾一下上一章是…

2006年威廉王子提出分手 舞会上凯特一袭护士装令他再次沦陷 迅速和好

虽然威廉王子和凯特米德尔顿是当今最有影响力和最令人心动的情侣之一&#xff0c;但许多人可能忘记了&#xff0c;早在 2006 年&#xff0c;两人还在约会时&#xff0c;他们曾短暂分手。尽管当时他们的分手可能让英国媒体感到意外&#xff0c;但不到一年后&#xff0c;两人就和…

Window部署Ollama+Qwen2.0+Open-WebUI

文章目录 Windows下安装Docker安装Docker检查是否安装成功, 出现版本即为安装成功安装Ollama启动 Ollama 并拉取模型(选做) 修改默认地址和端口(选做) Ollama 进行跨域配置安装open-webui Windows下安装Docker 准备条件 开启Hyper-V&#xff0c;在“启用或关闭Windows功能”里…

全网最强Linux教程 | 万字长文爆肝Linux操作系统

Linux 1.Linux的引言 Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和Unix的多用户、多任务、支持多线程和多CPU的操作系统。伴随着互联网的发展&#xff0c;Linux得到了来自全世界软件爱好者、组织、公司的支持。它除了在服务器操作系统方面保…

【数据保护】微软开源数据保护项目Presidio-匿名器

Presidio是由微软维护的开源数据保护项目&#xff0c;其主要包含三个功能模块&#xff0c;分别是&#xff1a; Presidio analyzer:该模块主要负责文本类数据敏感信息扫描。Presidio anonymizer:该模块主要负责对已检测到的敏感实体进行脱敏处理。Presidio image redactor&…

【深度学习】语音,Tacotron 2 ,TTS合成

图1展示了Tacotron 2系统架构的框图。该系统包含两个主要部分&#xff1a;特征预测网络和WaveNet vocoder。以下是架构的详细说明&#xff1a; 特征预测网络 输入文本&#xff1a;系统从输入文本开始&#xff0c;经过一系列处理生成语音特征。字符嵌入层&#xff1a;输入的字…

ITSS三级认证需要多少钱?

信息技术服务标准&#xff08;ITSS&#xff09;认证是评估一个企业在信息技术服务领域能力的标准之一&#xff0c;它涵盖了从基础标准、支撑标准到基于业务的需求侧和供给侧标准的全面内容。 具体条件 独立法人地位&#xff1a;申请单位需要具有独立的法人地位&#xff0c;这是…

[leetcode hot 150]第二百三十题,二叉搜索树中第k小的元素

题目&#xff1a; 给定一个二叉搜索树的根节点 root &#xff0c;和一个整数 k &#xff0c;请你设计一个算法查找其中第 k 小的元素&#xff08;从 1 开始计数&#xff09;。 二叉搜索树&#xff08;BST&#xff09;有一个特性&#xff1a;对于树中的任何节点&#xff0c;其左…

lora网关到底能带多少设备,lora网关容量是多少?

引言&#xff1a;在推广LoRa模块的过程中&#xff0c;我频繁地遇到关于LoRa网关设备承载能力与容量的询问。为了更清晰地解答这些疑问&#xff0c;本文将深入探讨一个LoRa网关能支持的设备数量&#xff0c;以及这些数量如何受不同参数影响。 那么今天我们就详细的看下一个网关能…

如何使用Apache Web服务器提供自定义错误页面?

当您管理网站时&#xff0c;会花费大量时间来定制软件、运行软件以及调整布局和设计以符合您对网站外观的想法。通常我们只考虑网站中我们期望访问者看到的部分。不幸的是&#xff0c;有些常见页面可能会被忽略&#xff1a;错误页面。 错误页面 虽然理想情况下任何人都不应该在…

Codigger 之软件项目体检:提升企业软件交付质量的秘密武器

在当今竞争激烈的商业环境中&#xff0c;企业软件交付的质量直接关系到企业的市场竞争力和客户满意度。高质量的软件不仅能够满足用户需求&#xff0c;还能降低长期的维护成本&#xff0c;提高企业的运营效率。因此&#xff0c;提升软件交付质量已成为企业关注的焦点。Codigger…

【限免】频控阵雷达:概念、原理与应用【附MATLAB代码】

​微信公众号&#xff1a;EW Frontier QQ交流群&#xff1a;949444104 主要内容 PDA、FDA MATLAB代码 %---------------------------------------- %功能:FDA和相控阵天线方向图 %版本:ver1.0 %时间:2017.11.1 %--------------------------------------- clear all; clc; disp…

一文速通GIT版本管理与分支控制

目录 1、了解Git功能 2、第一次使用Git&#xff08;首次配置好&#xff0c;后续不用再操作&#xff09; 打开git后端 设置用户签名 结果 3、初始项目架构 创建本地新仓库并初始化 文件添加到本地仓库 a.文件添加缓存区 b.缓存区内容提交到本地仓库 c.改写提交的注释 …

【产品分析】作业帮

​基本信息 作业帮是目前国内最大的 K12 在线教育类 APP&#xff0c;致力于为全国中小学生提供全学段的学习辅导服务&#xff0c;其课程覆盖小学&#xff0c;初中&#xff0c;高中所有学科&#xff0c;并支持在线答题解题、一对一辅导、作文搜索、直播课、题库练习等众多功能&…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第六十三章 输入子系统实验

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

Rpi Zero W做的老头乐声控灯

祭图__|\0>历经各种尝试&#xff0c;最后选了docker 里装个rhasspy&#xff0c;配上paho-mqtt搞出了这个奇葩夜灯。各种曲折就不说了&#xff0c;直接分享捷径思路。 这个绿板子是respeaker hat with 2 mic 用的是seeed-voicecard&#xff0c;跟着github编译&#xff0c;不…

SM2p256v1椭圆曲线点加点减倍点python实现代码

首先给出SM2p256v1椭圆曲线的建议参数如下&#xff1a; default_ecc_table {n: FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123,p: FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF,g: 32c4ae2c1f1981195f9904466a39c9948fe30bbff266…