C#枚举(一)使用总结以及扩展类分享
0.介绍
枚举是一组命名常量,其基础类型为任意整型。 如果没有显式声明基础类型, 则为Int32
在实际开发过程中,枚举的使用可以让代码更加清晰且优雅。
最近在对枚举的使用进行了一些总结与整理,也发现了一些很有意思的知识盲区。
接下来先简单为大家介绍枚举在开发过程中的常用内容以及扩展类的分享。如果喜欢直接看代码的可以查看最后的样例源码。
1. 参考资料
官方Doc https://docs.microsoft.com/zh-cn/dotnet/api/system.enum?view=net-5.0
博客 https://www.cnblogs.com/kissdodog/archive/2013/01/16/2863515.html
博客 https://www.cnblogs.com/willick/p/csharp-enum-superior-tactics.html
2.核心内容
枚举的使用心得
0.枚举数值在开发过程中一旦确定不允许更改(除非必要 )
1.在定义枚举的时候要设置0值,且不作为有效的业务值。(不作为有效值的原因是枚举的初始化值为零,在没有正确赋值的情况下,已经有默认值可能会造成困扰,所以直接不使用0作为业务有效值,可以省去不必要的麻烦,这半点纯属个人建议~)
这一点官方文档也有“最佳做法”的建议。
如果未定义值为0的枚举成员,则考虑创建 None 枚举常数。 默认情况下,由公共语言运行时将用于枚举的内存初始化为零。 因此,如果未定义值为零的常量,则在创建枚举时将包含非法值。
2.在前后端交互过程中,如果后端接收的对象中包含枚举的话,需要将枚举属性定义成可空枚举,否则前端数据有可能(前端属性值在后端的枚举值中匹配不上时)无法传输到后端。
3.数据库保存枚举值而非枚举属性字符串
虽然保存枚举属性字符串会更加直观,但是不利于后续枚举字符串重命名,且字符串长度限制也制约着枚举的命名...
枚举的基本用法
定义枚举
枚举并不显式从继承 Enum ; 继承关系由编译器隐式处理
// 枚举YesOrNo
public enum YesOrNo
{
[Description("")]
None = 0,
[Description("是")]
Yes = 1,
[Description("否")]
No = 2
}
// 枚举YesOrNo 基础类型为byte
public enum YesOrNo_Byte : byte
{
[Description("")]
None = 0,
[Description("是")]
Yes = 1,
[Description("否")]
No = 2
}
枚举 => 转字符串
string yesString = YesOrNo.Yes.ToString(); // Yes
枚举 => 转数字
int yesInt = (int)YesOrNo.Yes; // 1
字符串 => 枚举
YesOrNo yesOrNo_Yes = (YesOrNo)Enum.Parse(typeof(YesOrNo), "Yes"); // YesOrNo.Yes
数字 => 枚举
YesOrNo yesOrNo_No = (YesOrNo)2; // YesOrNo.No
获取所有的枚举成员
Array yesOrNos = Enum.GetValues(typeof(YesOrNo)); // [YesOrNo.None,YesOrNo.Yes,YesOrNo.No]
获取所有枚举成员的属性名
string[] yesOrNoNames = Enum.GetNames(typeof(YesOrNo)); // ["None","Yes","No"]
获取枚的举基础类型
Type typeInt = Enum.GetUnderlyingType(typeof(YesOrNo)); // System.Int32
Type typeByte = Enum.GetUnderlyingType(typeof(YesOrNo_Byte)); // System.Byte
扩展方法
字符串 => 转枚举
// GetEnum() 字符串 => 转枚举
var yesString = "Yes".GetEnum<YesOrNo>(); // YesOrNo.Yes
/// <summary>
/// 根据字符串转成指定枚举值
/// </summary>
public static T GetEnum<T>(this string enumString)
{
return (T)Enum.Parse(typeof(T), enumString);
}
枚举 => 转数字
// GetIntValue() 枚举 => 转数字
int yesInt = YesOrNo.Yes.GetIntValue(); // 1
/// <summary>
/// 获取枚举的值
/// </summary>
public static int GetIntValue(this Enum value)
{
return Convert.ToInt32(value);
}
获取枚举的描述
// GetDescription() 获取枚举的描述
var description = YesOrNo.Yes.GetDescription(); // 是
/// <summary>
/// 根据枚举获取枚举描述
/// </summary>
public static string GetDescription(this Enum value)
{
var field = value.GetType().GetField(value.ToString());
var customAttribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute));
if (customAttribute == null)
return value.ToString();
else
return ((DescriptionAttribute)customAttribute).Description;
}
将枚举字符串值与描述转字典
// GetEnumDescriptions() 获取枚举字符串值与描述
var dictionary = typeof(YesOrNo).GetEnumDescriptions(); // {{[None, ""]},{[Yes, 是]},{[No, 否]}}
/// <summary>
/// 获取枚举字符串值及描述值的字典
/// </summary>
public static IDictionary<string, string> GetEnumDescriptions(this Type enumType)
{
var dictionary = new Dictionary<string, string>();
foreach (Enum code in Enum.GetValues(enumType))
dictionary.Add(code.ToString(), code.GetDescription());
return dictionary;
}
将枚举值与描述转字典
// GetEnumIntDescriptions() 获取枚举值与描述
var intDictionary = typeof(YesOrNo).GetEnumIntDescriptions(); // {{[0, ""]},{[1, 是]},{[2, 否]}}
/// <summary>
/// 获取枚举值及描述值的字典
/// </summary>
public static IDictionary<int, string> GetEnumIntDescriptions(this Type enumType)
{
var dictionary = new Dictionary<int, string>();
foreach (Enum code in Enum.GetValues(enumType))
dictionary.Add(code.GetIntValue(), code.GetDescription());
return dictionary;
}
3.样例源码地址
C#枚举(一)使用总结以及扩展类分享的更多相关文章
- Java+7入门经典 - 6 扩展类与继承 Part 1/2
第6章 扩展类与继承 面向对象编程的一个重要特性: 允许基于已定义的类创建新的类; 6.1 使用已有的类 派生 derivation, 派生类 derived class, 直接子类 direct s ...
- C# 扩展类
C# 中提供一个非常实用的供能,扩展方法(Extension method) 扩展方法是通过额外的静态方法扩展现有的类型.通过扩展方法,可以对已有类型做自己想做的相关扩展.方法:定义静态类,扩展方法也 ...
- tp中调用PHP系统扩展类
例如使用Redis扩展类: use Reids; $redis = new Redis();
- Thinkphp编辑器扩展类kindeditor用法
一, 使用前的准备. 使用前请确认你已经建立好了一个Thinkphp站点项目. 1,Keditor.class.php和JSON.class.php 是编辑器扩展类文件,将他们拷贝到你的站点项目的Th ...
- 扩展javascript扩展(类,对象,原型)
扩展javascript扩展(类,对象,原型)
- 颜色扩展类--ColorExtensions
/// <summary> /// 颜色扩展类 /// </summary> public static class ColorExtensions { /// <sum ...
- PHP扩展类ZipArchive实现压缩解压Zip文件和文件打包下载
文章转载自:https://my.oschina.net/junn/blog/104464 PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PH ...
- ASP.NET MVC4 HtmlHelper扩展类,实现分页功能 @Html.ShowPageNavigate
本文主要做了一个HtmHelper类的分页扩展函数,方便在视图中调用,有需要的朋友可以参考一下,希望对大家有所帮助. 1.扩展HtmlHelper类方法ShowPageNavigate output. ...
- C#操作Xml树的扩展类
本文提供一个操作Xml树的扩展类,与将xml字符串直接映射成实体对象的使用方法,供大家参考,学习. 下面附上源码 using System; using System.Collections.Gene ...
随机推荐
- nginx启动失败(bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket...permissions)
nginx启动失败 nginx启动失败(bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a ...
- Jmeter(三十六) - 从入门到精通进阶篇 - 设置负载阶梯式压测场景(详解教程)
1.简介 在性能测试中,有时需要模拟一种实际生产中经常出现的情况,即:从某个值开始不断增加压力,直至达到某个值,然后持续运行一段时间,然后继续加压达到某个值持续运行,如此循环直到达到预期的峰值,运行一 ...
- 用 CSS background 实现刻度线的呈现
有的时候,我们需要在网页中的进度条或某种度量计上呈现一条条的刻度线.例如这种: 简单的实现方式,大致有两种:一是用图片做背景,横向平铺线条图片:二是给每一块刻度区域平铺一个元素,然后用边线实现.身为一 ...
- 制作 Ubuntu 16.04 离线apt源
1.下载离线安装包 ubuntu下安装包都会下载到/var/cache/apt/archives下,首先清空该目录 sudo apt-get clean 下载需要安装包 sudo apt-get in ...
- 自导自演的面试现场,趣学MySQL的10种文件
导读 Hi,大家好!我是白日梦!本文是MySQL专题的第 24 篇. 今天我要跟你分享的MySQL话题是:"自导自演的数据库面试现场--谈谈MySQL的10种文件" 换一种写作风格 ...
- IEEE Standard 754 for Binary Floating-Point Arithmetic
IEEE 754-2008 - IEEE Standard for Floating-Point Arithmetic https://standards.ieee.org/standard/754- ...
- 一例 Go 编译器代码优化 bug 定位和修复解析
https://mp.weixin.qq.com/s/Tyl6dSb7mHBuqqN6WvEuaw
- secure hashes message digests 安全哈希 消息摘要
hashlib --- 安全哈希与消息摘要 - Python 3.8.3 文档 https://docs.python.org/zh-cn/3.8/library/hashlib.html hashl ...
- https://www.cs.cmu.edu/~dga/papers/cuckoo-conext2014.pdf 检验hash冲突
https://github.com/google/cityhash We like to test hash functions with SMHasher, among other things. ...
- JAXB学习(二): 对JAXB支持的主要注解的说明
我们在上一篇中对JAXB有了一个大致的认识,现在我们来了解JAXB的一些主要注解. 顶层元素:XmlRootElement 表示整个XML文档的类应该使用XmlRootElement修饰,其实就像之前 ...