[C.C++] C#使用Enum.TryParse()实现枚举安全转换

2099 0
Honkers 2022-11-10 08:42:51 | 显示全部楼层 |阅读模式
在项目中,有时候会用到领域枚举和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();
        }
    }运行报错:


这正是我们预设的报错方式。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对中国红客联盟的支持。如果你想了解更多相关内容请查看下面相关链接

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行