C#使用Enum.TryParse()实现枚举安全转换
作者:Darren?Ji 时间:2021-10-27 05:29:06
在项目中,有时候会用到领域枚举和DTO枚举的映射和转换。有一个现实的问题是:如果领域枚举项发生变化,而DTO枚举项没有及时更新,这样会造成映射不上的问题。那么,如何避免此类问题呢?
先看领域枚举和DTO枚举映射完好的情况。
class Program
{
static void Main(string[] args)
{
var queryOrderStatus = (QueryOrderStatus)OrderState.Active;
Console.WriteLine(queryOrderStatus);
Console.ReadKey();
}
}
public enum OrderState
{
NotActivated,
Active,
RequiresReActivation
}
public enum QueryOrderStatus
{
NotActivated,
Active,
RequiresReActivation
}
输出结果:Active
假如,我们在领域模型中加了一个枚举项
public enum OrderState
{
NotActivated,
Active,
RequiresReActivation,
Locked
}
在客户端。
class Program
{
static void Main(string[] args)
{
var queryOrderStatus = (QueryOrderStatus)OrderState.Locked;
Console.WriteLine(queryOrderStatus);
Console.ReadKey();
}
}
输出结果:3
如果再把客户端改成这样:
class Program
{
static void Main(string[] args)
{
var queryOrderState = (QueryOrderStatus)OrderState.Locked;
if(queryOrderState == QueryOrderStatus.Active)
Console.WriteLine("Active");
if(queryOrderState == QueryOrderStatus.NotActivated)
Console.WriteLine("NotActivated");
if(queryOrderState == QueryOrderStatus.RequiresReActivation)
Console.WriteLine("RequiresReActivation");
Console.ReadKey();
}
}
输出结果:什么都没有
也就是说,在领域枚举发生变化的时候,DTO枚举没有适时更新,会造成映射不上的问题。如何避免呢?
--使用Enum.TryParse()实现枚举的安全转换
使用Enum.TryParse(),把客户端改成:
class Program
{
static void Main(string[] args)
{
var domainState = OrderState.Locked;
QueryOrderStatus queryState;
if (!Enum.TryParse(domainState.ToString(), out queryState))
{
throw new FormatException("枚举项 '"+domainState+"' 在对应的DTO中不存在" );
}
Console.ReadKey();
}
}
运行报错:
这正是我们预设的报错方式。
来源:https://www.cnblogs.com/darrenji/p/3852737.html
标签:C#,Enum,TryParse,枚举,安全,转换
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C# 实现简易的串口监视上位机功能附源码下载
2023-10-12 11:12:19
![](https://img.aspxhome.com/file/2023/1/106421_0s.png)
Java动态 代理和AOP应用示例
2023-11-26 07:45:02
![](https://img.aspxhome.com/file/2023/0/60270_0s.png)
Spring boot集成Kafka消息中间件代码实例
2022-11-06 21:53:48
![](https://img.aspxhome.com/file/2023/6/61786_0s.jpg)
spring boot实战之本地jar包引用示例
2021-11-01 20:44:45
Java和C#输入输出流的方法(详解)
2022-06-24 09:21:02
C# 利用代理爬虫网页的实现方法
2023-02-26 18:51:43
详解C#之委托
2021-12-12 00:17:49
![](https://img.aspxhome.com/file/2023/0/79100_0s.png)
浅谈单例模式和线程安全问题
2023-11-25 06:27:34
![](https://img.aspxhome.com/file/2023/2/98402_0s.jpg)
Java进阶之FileUpload完成上传的实例
2022-03-26 03:39:55
List调用toString()方法后,去除两头的中括号实例
2023-09-28 11:18:56
C# 泛型集合类List<T>使用总结
2021-08-30 02:04:01
![](https://img.aspxhome.com/file/2023/0/113780_0s.jpg)
Java实现多线程断点下载
2022-04-27 00:29:16
![](https://img.aspxhome.com/file/2023/9/76319_0s.png)
C#读写指定编码格式的文本文件
2023-06-16 03:45:41
java10下编译lombok注解代码分享
2023-06-06 11:02:35
Java数据结构之ArrayList从顺序表到实现
2022-06-14 00:53:25
![](https://img.aspxhome.com/file/2023/1/68771_0s.png)
Java的JNI快速入门教程(推荐)
2022-11-22 16:10:48
Java 反射调用静态方法的简单实例
2021-10-09 06:47:58
Android 监听手机GPS打开状态实现代码
2022-09-28 08:56:38
C#如何使用Bogus创建模拟数据示例代码
2023-10-11 10:57:50
![](https://img.aspxhome.com/file/2023/6/94606_0s.png)
Flutter开发之Widget自定义总结
2021-11-07 12:41:03
![](https://img.aspxhome.com/file/2023/0/111720_0s.jpg)