C#使用Enum.TryParse()实现枚举安全转换
作者:Darren Ji
这篇文章介绍了C#使用Enum.TryParse()实现枚举安全转换的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
在项目中,有时候会用到领域枚举和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(); } }
运行报错:
这正是我们预设的报错方式。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接