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

目录

一、推荐的枚举写法

二、获取注释的封装代码

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

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

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

六、创建一个【枚举字典】,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();
}

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

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

 //1.已知【枚举】,获取注释、索引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.mzph.cn/news/875894.shtml

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

相关文章

河道高效治理新策略:视频AI智能监控如何助力河污防治

一、背景与现状 随着城市化进程的加快&#xff0c;河道污染问题日益严重&#xff0c;对生态环境和居民生活造成了严重影响。为了有效治理河道污染&#xff0c;提高河道管理的智能化水平&#xff0c;TSINGSEE青犀提出了一套河污治理视频智能分析及管理方案。方案依托先进的视频…

gitee设置ssh公钥密码避免频繁密码验证

gitee中可以创建私有项目&#xff0c;但是在clone或者push都需要输入密码&#xff0c; 比较繁琐。 公钥则可以解决该问题&#xff0c;将私钥放在本地&#xff0c;公钥放在gitee上&#xff0c;当对项目进行操作时带有的私钥会在gitee和公钥进行验证&#xff0c;避免了手动输入密…

WEB攻防-通用漏洞-SQL 读写注入-MYSQLMSSQLPostgreSQL

什么是高权限注入 高权限注入指的是攻击者通过SQL注入漏洞&#xff0c;利用具有高级权限的数据库账户&#xff08;如MYSQL的root用户、MSSQL的sa用户、PostgreSQL的dba用户&#xff09;执行恶意SQL语句。这些高级权限账户能够访问和修改数据库中的所有数据&#xff0c;甚至执行…

Spring项目中发生log依赖冲突如何解决

异常信息 Caused by: org.apache.logging.log4j.LoggingException: log4j-slf4j-impl cannot be present with log4j-to-slf4分析 根据异常信息分析&#xff0c;可以看出是slf4j的实现有两个依赖&#xff0c;只需要移除log4j-slf4j-impl或log4j-to-slf4j其中一个库的依赖&…

如何合并电脑硬盘分区?轻松合并电脑硬盘分区

在日常使用电脑的过程中&#xff0c;我们有时需要对硬盘进行分区管理。然而&#xff0c;随着时间的推移&#xff0c;我们可能会发现原有的分区设置不再满足需求&#xff0c;这时就需要对分区进行调整&#xff0c;甚至合并分区。那么&#xff0c;我们该如何合并电脑硬盘分区呢&a…

攻坚克难岁月长,自主腾飞世界强——回顾近代中国数据库的发展与飞跃

前言 最近看了《中国数据库前世今生》纪录片&#xff0c;感触颇深&#xff0c;也是一直在思考到底该用何种方式起笔来回顾这段筚路蓝缕却又充满民族自豪感的历程。大概构思了一周左右吧&#xff0c;我想&#xff0c;或许还是应该从那个计算机技术在国内刚刚萌芽的年代开始讲起…

Arthas在线诊断案例实战整理

会一直持续更新。。。 Arthas 是一款线上监控诊断产品&#xff0c;通过全局视角实时查看应用 load、内存、gc、线程的状态信息&#xff0c;并能在不修改应用代码的情况下&#xff0c;对业务问题进行诊断&#xff0c;包括查看方法调用的出入参、异常&#xff0c;监测方法执行耗时…

SAPUI5基础知识19 - 视图嵌套(Nested Views)

1. 背景 SAPUI5 是一个用于构建企业级 Web 应用程序的 JavaScript 框架。它提供了丰富的 UI 控件和工具&#xff0c;帮助开发者创建复杂的用户界面。Nested Views 是 SAPUI5 中的一种设计模式&#xff0c;允许在一个视图中嵌套另一个视图。这种模式有助于模块化和重用代码&…

低代码如何加速数字化转型

数字化转型&#xff0c;正日益决定企业成功的关键。这里的一个关键因素是它可以以更快的速度和质量来实施技术计划。在当今瞬息万变的商业环境中&#xff0c;战略性地采用低代码平台对于旨在加快上市时间、增强业务敏捷性和促进跨团队无缝协作的首席技术官来说至关重要。日益增…

react中组件间的通信

一、父传子 1.代码展示 import React, { useState } from react;function SonPage(props){ // 子组件const {msg} propsreturn (<div>我是子组件 {msg}</div>) }function App() { // 父组件const [msgText,setMsgText] useState(父传子)return (<div classN…

快速入门Jupyter notebook

快速入门 Jupyter notebook 一、前言&#xff08;一&#xff09;优点&#xff08;二&#xff09;特点&#xff08;三&#xff09;调用运行&#xff08;四&#xff09;新建 二、认识界面快捷键&#xff08;一&#xff09;三种模式&#xff08;1&#xff09;蓝色模式&#xff1a;…

【echarts】中如何设置曲线展示最新值、最大值、最小值

需要用到的属性&#xff1a;图表标注 series-line. markPoint 默认可以通过 type直接标注&#xff1a;‘min’ 最小值、‘max’ 最大值、‘average’ 平均值。 markPoint: {data: [{type: max},{type: min}]}如何展示最新值 如果要展示最新值得话&#xff0c;需要设置 标注…

ICMPv6与NDP

ICMP ICMPv6是 IPv6 的基础协议之一。 在 IPv6 报文头部中, Next Header 字段值为 58 则对应为 ICMPv6 报文。 ICMPv6报文用于通告相关信息或错误。 ICMP报文 Type字段:0-127表示差错消息,128-255表示信息消息。 ICMP消息类型 差错消息 差错消息用于报告在转发IPv6数据包过…

如何应对SQL注入攻击?

引言 在现今的网络世界中&#xff0c;安全性已成为至关重要的话题。SQL注入&#xff08;SQL Injection&#xff09;是一种常见且危险的网络攻击方式&#xff0c;攻击者通过向SQL查询中插入恶意代码来操控数据库&#xff0c;从而获取敏感信息或破坏数据。了解SQL注入的各种类型…

案例分析:人工智能在航空航天领域的应用

作者主页: 知孤云出岫 目录 作者主页:案例分析&#xff1a;人工智能在航空航天领域的应用引言人工智能在航空航天中的主要应用案例分析案例一&#xff1a;AI优化航天器设计案例二&#xff1a;AI辅助飞行安全——预测维护案例三&#xff1a;AI自动驾驶系统案例四&#xff1a;A…

【Maven学习】-2. POM讲解

文章目录 2. POM讲解2.1 POM.xml2.2 POM 结构1) modules2) parent3) properties4) dependency依赖范围 5) repository仓库分类 6) build自定义打包名字指定打包路径 7) 插件-pluginsmaven-compiler-pluginmaven-surefire-pluginmaven-jar-pluginmaven-install-pluginmaven-clea…

秋招突击——7/23——百度提前批面试准备和正式面试

文章目录 引言一面准备面试预演一1、讲一下hashcode()和equals()关系2、equals()和有什么区别3、讲一下重载和重写的区别4、讲一下深拷贝、浅拷贝的区别5、讲一下Java异常的基类&#xff0c;运行时异常举几个例子&#xff0c;什么情况下会出现&#xff1f;6、讲一下Java中线程的…

vue3+ts+vite+electron+electron-packager打包成exe文件

目录 1、创建vite项目 2、添加需求文件 3、根据package.json文件安装依赖 4、打包 5、electron命令运行 6、electron-packager打包成exe文件 Build cross-platform desktop apps with JavaScript, HTML, and CSS | Electron 1、创建vite项目 npm create vitelatest 2、添…

【C++】深度解析:用 C++ 模拟实现 list 类,探索其底层实现细节

目录 list介绍 list模拟实现 list 节点类 list 的迭代器 定义 构造函数 解引用 operator前置和--与后置和-- operator与operator! list 类 构造函数 begin()和end() 拷贝构造 erase() clear() 析构函数 insert push_back 和 push_front pop_back 和 pop_front…

Leetcode—769. 最多能完成排序的块【中等】

2024每日刷题&#xff08;149&#xff09; Leetcode—769. 最多能完成排序的块 实现代码 class Solution { public:int maxChunksToSorted(vector<int>& arr) {int ans 0;int mx INT_MIN;for(int i 0; i < arr.size(); i) {mx max(arr[i], mx);if(mx i) {a…