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

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

  • 相关阅读:
    Linux下卸载mysql
    ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA
    Centos系统创建用户oracle后,用该用户登陆系统,页面加载报错GConf error
    Java Web 深入分析(6) Tomcat
    CSS 类选择器
    myeclipse 破解
    Java Web 深入分析(5) Java ClassLoader 工作机制
    JFinal(2)JFinal 学习资料
    JFinal(1)JFinal helloworld
    Java Web 深入分析(4) Java IO 深入分析
  • 原文地址:https://www.cnblogs.com/darrenji/p/3852737.html
Copyright © 2011-2022 走看看