zoukankan      html  css  js  c++  java
  • 使用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();
            }
        }

    运行报错:

    1

    这正是我们预设的报错方式。   

  • 相关阅读:
    Photoshop 更改图片颜色
    搜索引擎优化网页设计:最佳实践
    Cocos2d-x 精灵碰撞检測(方法一)
    JS 计算2个日期相差的天数
    《Java并发编程实战》第七章 取消与关闭 读书笔记
    LeetCode_3Sum
    Pascal Hexagrammum Mysticum 的深度探索
    HDU 5274 Dylans loves tree(LCA+dfs时间戳+成段更新 OR 树链剖分+单点更新)
    高速查询hive数据仓库表中的总条数
    cocos2d-x触摸事件优先级
  • 原文地址:https://www.cnblogs.com/darrenji/p/3852737.html
Copyright © 2011-2022 走看看