日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C#使用Enum.TryParse()實現枚舉安全轉換_C#教程

作者:Darren?Ji ? 更新時間: 2022-10-09 編程語言

在項目中,有時候會用到領域枚舉和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

欄目分類
最近更新