开源 - Ideal库 - 常用枚举扩展方法(一)

news/2024/11/14 10:14:10/文章来源:https://www.cnblogs.com/hugogoos/p/18542907

今天和大家享一些关于枚举操作相关的常用扩展方法。

我们平时用的比较多的是正常枚举,同时还有加[Flags]特性的位标志枚举,因此以下所有扩展方法同时适用正常枚举以及位标志枚举。

我们首先定义两种枚举用于下面扩展方法测试适用,代码如下:

//正常枚举
internal enum StatusEnum
{[Description("正常")]Normal = 0,[Description("待机")]Standby = 1,[Description("离线")]Offline = 2,Online = 3,
}
//位标志枚举
[Flags]
internal enum TypeFlagsEnum
{[Description("Http协议")]Http = 1,[Description("Udp协议")]Udp = 2,[Description("Http协议,Udp协议")]HttpAndUdp = 3,[Description("Tcp协议")]Tcp = 4,
}

01、根据枚举名称转换成枚举

该方法接收枚举名称字符串,并转为对应枚举,转换失败则返回空。

首先会校验字符串是否为整数值类型字符串,如果是则直接返回空,因为枚举名称不可能是整数类型字符串。

然后调用TryParse方法进行转换,具体代码如下:

//根据枚举名称转换成枚举,转换失败则返回空
public static T? ToEnumByName<T>(this string name) where T : struct, Enum
{//如果为整数类型字符串,则直接返回空if (int.TryParse(name, out _)){return default;}//转换成功则返回结果,否则返回空if (Enum.TryParse<T>(name, out var result)){return result;}return default;
}

下面我们对其进行详细的单元测试,分别针对正常枚举和位标志枚举两种情况测试,具体用例如下:

(1) 正常枚举名称字符串,成功转换成枚举;

(2) 不存在的枚举名称字符串,返回空;

(3) 整数类型的字符串,返回空;

(4) 正常位标志枚举名称字符串,成功转换成枚举;

(5) 不存在的位标志枚举名称字符串,返回空;

(6) 正常的位标志枚举名称组合字符串,成功转换成枚举;

(7) 不存在的位标志枚举名称组合字符串,返回空;

位标志枚举名称组合字符串是指两个枚举项组合的情况,这也是位标志枚举特色,不了解位标志枚举的可以自行先补充一下相关知识点。

具体代码如下:

[Fact]
public void ToEnumByName()
{//正常枚举名称字符串,成功转换成枚举var status = "Standby".ToEnumByName<StatusEnum>();Assert.Equal(StatusEnum.Standby, status);//不存在的枚举名称字符串,返回空var isStatusNull = "StandbyNull".ToEnumByName<StatusEnum>();Assert.Null(isStatusNull);//整数类型的字符串,返回空var isStatusNullInt = "3".ToEnumByName<StatusEnum>();Assert.Null(isStatusNullInt);//正常位标志枚举名称字符串,成功转换成枚举var flags = "HttpAndUdp".ToEnumByName<TypeFlagsEnum>();Assert.Equal(TypeFlagsEnum.HttpAndUdp, flags);//不存在的位标志枚举名称字符串,返回空var isFlagsNull = "HttpAndUdpNull".ToEnumByName<TypeFlagsEnum>();Assert.Null(isFlagsNull);//正常的位标志枚举名称组合字符串,成功转换成枚举var flagsGroup = "Http,Tcp".ToEnumByName<TypeFlagsEnum>();Assert.Equal(TypeFlagsEnum.Http | TypeFlagsEnum.Tcp, flagsGroup);//不存在的位标志枚举名称组合字符串,返回空var isFlagsGroupNull = "Http,Tcp,Null".ToEnumByName<TypeFlagsEnum>();Assert.Null(isFlagsGroupNull);
}

02、根据枚举名称转换成枚举或默认值

该方法是对上一个方法的补充,用于处理转换不成功时,则返回一个指定默认枚举值,具体代码如下:

//根据枚举名称转换成枚举,转换失败则返回默认枚举
public static T ToEnumOrDefaultByName<T>(this string name, T defaultValue) where T : struct, Enum
{//调用根据枚举名称转换成枚举方法var result = name.ToEnumByName<T>();if (result.HasValue){return result.Value;}//转换失败则返回默认值return defaultValue;
}

因为该方法调用了上一个方法,因此我们就简单测试一下,转换成功返回正确的值,转换失败则返回默认值,具体代码如下:

[Fact]
public void ToEnumOrDefaultByName()
{//正常枚举名称字符串,成功转换成枚举var status = "Standby".ToEnumOrDefaultByName(StatusEnum.Normal);Assert.Equal(StatusEnum.Standby, status);//不存在的枚举名称字符串,返回指定默认值var statusDefault = "StandbyNull".ToEnumOrDefaultByName(StatusEnum.Standby);Assert.Equal(StatusEnum.Standby, statusDefault);
}

03、根据枚举描述转换成枚举

该方法接收枚举描述字符串,并转为对应枚举,转换失败则返回空,其中如果枚举项没有描述则以枚举名称代替,具体代码如下:

//根据枚举描述转换成枚举,转换失败返回空
public static T? ToEnumByDesc<T>(this string description) where T : struct, Enum
{//首先获取枚举所有项foreach (Enum value in Enum.GetValues(typeof(T))){//取枚举项描述与目标描述相比较,相同则返回该枚举项if (value.ToEnumDesc() == description){return (T)value;}}//未查到匹配描述则返回默认值return default;
}

其中ToEnumDesc方法下文会详细讲解。

我们针对该方法进行以下五种情况进行单元测试:

(1) 正常枚举描述字符串,成功转换成枚举;

(2) 如果枚举项没有枚举描述,则枚举名称字符串,成功转换成枚举;

(3) 不存在的枚举描述字符串,返回空;

(4) 正常位标志枚举描述字符串,成功转换成枚举;

(5) 不存在的位标志枚举描述字符串转换,返回空;

具体代码如下:

[Fact]
public void ToEnumByDescription()
{//正常枚举描述字符串,成功转换成枚举var status = "待机".ToEnumByDesc<StatusEnum>();Assert.Equal(StatusEnum.Standby, status);//如果枚举项没有枚举描述,则枚举名称字符串,成功转换成枚举var statusNotDesc = "Online".ToEnumByDesc<StatusEnum>();Assert.Equal(StatusEnum.Online, statusNotDesc);//不存在的枚举描述字符串,返回空var isStatusNull = "待机无".ToEnumByDesc<StatusEnum>();Assert.Null(isStatusNull);//正常位标志枚举描述字符串,成功转换成枚举var flags = "Http协议,Udp协议".ToEnumByDesc<TypeFlagsEnum>();Assert.Equal(TypeFlagsEnum.HttpAndUdp, flags);//不存在的位标志枚举描述字符串转换,返回空var isFlagsNull = "Http协议Udp协议".ToEnumByDesc<TypeFlagsEnum>();Assert.Null(isFlagsNull);
}

04、根据枚举描述转换成枚举或默认值

该方法是对上一个方法的补充,用于处理转换不成功时,则返回一个指定默认枚举值,其中如果枚举项没有描述则以枚举名称代替,具体代码如下:

//根据枚举描述转换成枚举,转换失败返回默认枚举
public static T? ToEnumOrDefaultByDesc<T>(this string description, T defaultValue) where T : struct, Enum
{//调用根据枚举描述转换成枚举方法var result = description.ToEnumByDesc<T>();if (result.HasValue){return result.Value;}//未查到匹配描述则返回默认值return defaultValue;
}

同样的我们进行简单的单元测试:

[Fact]
public void ToEnumOrDefaultByDesc()
{//正常枚举描述字符串,成功转换成枚举var status = "待机".ToEnumOrDefaultByDesc(StatusEnum.Offline);Assert.Equal(StatusEnum.Standby, status);//不存在的枚举描述字符串,返回指定默认值var statusDefault = "待机无".ToEnumOrDefaultByDesc(StatusEnum.Offline);Assert.Equal(StatusEnum.Offline, statusDefault);
}

05、根据枚举名称转换成枚举值

该方法接收枚举名字字符串,并转为对应枚举值,转换失败则返回空,具体代码如下:

//根据枚举名称转换成枚举值,转换失败则返回空
public static int? ToEnumValueByName<T>(this string name) where T : struct, Enum
{//调用根据枚举名称转换成枚举方法var result = name.ToEnumByName<T>();if (result.HasValue){return Convert.ToInt32(result.Value);}//转换失败则返回空return default;
}

我们对其进行以下五种情况做详细的单元测试:

(1) 正常枚举名称字符串,成功转换成枚举值;

(2) 不存在的枚举名称字符串,返回空;

(3) 正常位标志枚举名称字符串,成功转换成枚举值;

(4) 正常的位标志枚举名称组合字符串,成功转换成枚举值;

(5) 不存在的位标志枚举Int值转换则返回空;

具体代码如下:

[Fact]
public void ToEnumValueByName()
{//正常枚举名称字符串,成功转换成枚举值var status = "Standby".ToEnumValueByName<StatusEnum>();Assert.Equal(1, status);//不存在的枚举名称字符串,返回空var isStatusNull = "StandbyNull".ToEnumValueByName<StatusEnum>();Assert.Null(isStatusNull);//正常位标志枚举名称字符串,成功转换成枚举值var flags = "HttpAndUdp".ToEnumValueByName<TypeFlagsEnum>();Assert.Equal(3, flags);//正常的位标志枚举名称组合字符串,成功转换成枚举值var flagsGroup = "Http,Udp".ToEnumValueByName<TypeFlagsEnum>();Assert.Equal(3, flagsGroup);//不存在的位标志枚举名称字符串,返回空var isFlagsNull = "HttpUdp".ToEnumValueByName<TypeFlagsEnum>();Assert.Null(isFlagsNull);
}

06、根据枚举名称转换成枚举值或默认值

该方法是对上一个方法的补充,用于处理转换不成功时,则返回一个指定默认枚举值,具体代码如下:

//根据枚举名称转换成枚举值,转换失败则返回默认枚举值
public static int ToEnumValueOrDefaultByName<T>(this string name, int defaultValue) where T : struct, Enum
{//根据枚举名称转换成枚举值var result = name.ToEnumValueByName<T>();if (result.HasValue){return result.Value;}//转换失败则返回默认值return defaultValue;
}

我们进行简单的单元测试,具体代码如下:

[Fact]
public void ToEnumValueOrDefaultByName()
{//正常枚举名称字符串,成功转换成枚举值var status = "Standby".ToEnumValueOrDefaultByName<StatusEnum>(2);Assert.Equal(1, status);//不存在的枚举名称字符串,返回指定默认值var statusDefault = "StandbyNull".ToEnumValueOrDefaultByName<StatusEnum>(2);Assert.Equal(2, statusDefault);
}

07、根据枚举名称转换成枚举描述

该方法接收枚举名字字符串,并转为对应枚举描述,转换失败则返回空,其中如果枚举项没有描述则以枚举名称代替,具体代码如下:

//根据枚举名称转换成枚举描述,转换失败则返回空
public static string? ToEnumDescByName<T>(this string name) where T : struct, Enum
{//调用根据枚举名称转换成枚举方法var result = name.ToEnumByName<T>();if (result.HasValue){//转为枚举描述return result.Value.ToEnumDesc();}//转换失败则返回空return default;
}

因为该方法内部都是调用现有方法,因此做个简单单元测试,具体代码如下:

[Fact]
public void ToEnumDescByName()
{//正常位标志枚举名称字符串,成功转换成枚举描述var flags = "HttpAndUdp".ToEnumDescByName<TypeFlagsEnum>();Assert.Equal("Http协议,Udp协议", flags);//正常的位标志枚举名称组合字符串,组合项存在,成功转换成枚举描述var flagsGroup = "Http,Udp".ToEnumDescByName<TypeFlagsEnum>();Assert.Equal("Http协议,Udp协议", flagsGroup);//正常的位标志枚举名称组合字符串,组合项不存在,成功转换成枚举描述var flagsGroup1 = "Http,Tcp".ToEnumDescByName<TypeFlagsEnum>();Assert.Equal("Http协议,Tcp协议", flagsGroup1);
}

08、根据枚举名称转换成枚举描述或默认值

该方法是对上一个方法的补充,用于处理转换不成功时,则返回一个指定默认枚举描述,具体代码如下:

//根据枚举名称转换成枚举描述,转换失败则返回默认枚举描述
public static string ToEnumDescOrDefaultByName<T>(this string name, string defaultValue) where T : struct, Enum
{//调用根据枚举名称转换成枚举描述方法var result = name.ToEnumDescByName<T>();if (!string.IsNullOrWhiteSpace(result)){return result;}//转换失败则返回默认枚举描述return defaultValue;
}

做个简单单元测试,具体代码如下:

[Fact]
public void ToEnumDescOrDefaultByName()
{//正常枚举名称字符串,成功转换成枚举描述var status = "Standby".ToEnumDescOrDefaultByName<StatusEnum>("测试");Assert.Equal("待机", status);//不存在的枚举名称字符串,返回指定默认枚举描述var statusDefault = "StandbyNull".ToEnumDescOrDefaultByName<StatusEnum>("测试");Assert.Equal("测试", statusDefault);
}

稍晚些时候我会把库上传至Nuget,大家可以直接使用Ideal.Core.Common。

:测试方法代码以及示例源码都已经上传至代码库,有兴趣的可以看看。https://gitee.com/hugogoos/Ideal

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

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

相关文章

2024腾讯云双十一必抢清单:省钱、省心、省力的购买攻略

一、前言 大家好,我是 Neo!一年一度的双十一购物狂欢节又到了!在这个特别的日子,腾讯云也推出了超一、前言 大家好,我是 Neo!一年一度的双十一购物狂欢节又到了!在这个特别的日子,腾讯云也推出了超值的优惠活动。最近我正好在做自己的小程序项目,需要用到服务器,特意…

Pytest自动化发现测试数据并进行数据驱动-支持YAML/JSON/INI/CSV数据文件

需求在测试框架中,往往需要测试数据和代码分离,使用CSV或JSON等数据文件存储数据,使用代码编写测试逻辑 一个用例过程往往可以测试多组数据,Pytest原生的参数化往往需要我们自己手动读取数据文件,比较麻烦又略显混乱 我们如何能把数据文件按约定的目录和文件名存起来,文件…

IT Manager项目管理工具-最新版

为了解决项目管理的难点,过多纸质办公的问题,诞生了该系统。其中的价值点包括几大点: 公司组织架构管理;项目成员管理,项目分解,任务分配,时间进度,质量把控; 周报,月报,工时统计;查看项目成员工作饱和度;协助公司进行有效的项目成本控制 组织数据初始化 首先需要…

概率统计-常见分布的均值及方差

概率统计-常见分布的均值及方差 纯原创+老师的PPT总结部分,作二级结论

团队作业4-2

仓库地址:https://github.com/bitpurleclude/GDUT-Goofish.git这个作业属于哪个课程 (https://edu.cnblogs.com/campus/gdgy/CSGrade22-34/join?id=CfDJ8AOXHS93SCdEnLt5HW8VuxT_rAhbZKO3TfjMmbv1B0Re5Fp2d0_QACha2ZoYZ4fxF-ZKCCAhfJl7B8mvCfesLYE02X8T6kx_2R8w0SR-ykrgDVRKW…

【nginx安全】Nginx日志安全分析脚本

Nginx 日志的重要性和必要性 我们知道 Nginx 属于是程序日志的范畴,相对于系统日志来说层级要低一些了,但对于站长来说是至关重要的。因为 Nginx 日志里记录着站点来访的所有信息,无论是正常访客还是恶意请求都会在日志里留下痕迹,比如:被采集、恶意刷流量、暴力破解、漏洞…

MethodImpl优化性能

参数解释 MethodImplOptions.AggressiveInlining:请求编译器在可能的情况下对方法进行内联。 MethodImpl:这是一个属性,允许开发者为方法指定特定的实现行为,比如请求内联、忽略栈追踪等。 内联的作用 内联的主要作用是提升性能,特别是在如下情况下: 消除方法调用开销:通…

五步快速搭建企业客户服务知识库

引言 在当今竞争激烈的市场环境中,高效、准确的客户服务已成为企业赢得客户信任与忠诚度的关键。一个完善的企业客户服务知识库,不仅能够显著提升客服团队的工作效率,还能极大增强客户的满意度与忠诚度。本文将详细介绍五步快速搭建并优化企业客户服务知识库的方法,并特别推…

基于FCM模糊聚类算法的图像分割matlab仿真

1.算法运行效果图预览 (完整程序运行后无水印) 2.算法运行软件版本 matlab2022a3.部分核心程序 (完整版代码包含详细中文注释和操作步骤视频)I_mean = func_median(Im1,Lwin);%% 将图像灰度按列排列 X = Im1(:); X_spatial = I_mean(:);% 初始化标签数组 I_clu…

2024.11.12总结报告(一本“英语八年级上册”TEST4 A完形填空 难度:2)

今日份错误:基本介绍:本题为完形填空选择题,一共10题,错误2题 基本考点:本题考查重点为翻译和理解,难点为语法和词汇 错误题目:(7)(10) 分析:(7) 本小题的错误原因为语法,理解中出现错误,具体为动词的过去式与过去分词并未熟练掌握,上下文的联系不够紧密,对文…

Alpha冲刺阶段博客

数字电路模拟游戏团队 Alpha冲刺阶段博客 一、Scrum Meeting 第六周会议记录 第七周会议记录 二、测试报告 Alpha阶段测试报告 三、习得的软工原理/方法/技能? 1. 迭代开发与持续集成 采用迭代开发模式可以极大的提高开发效率,降低开发成本,迭代开发是一种增量式的软件开发方…

【shell脚本】了解一下shell中的主机变量和本地语系变量

简单介绍一下在 shell 脚本中的主机变量和本地语系变量。 版本和主机信息变量 shell 内置了一些变量,用于记录主机、硬件、操作系统等信息。这些变量如下:本地语系变量这些变量的优先级关系为:LC_ALL > LC_* > LANG ​原创 模糊的程序员