在項目中,有時候會用到領域枚舉和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(); } }
運行報錯:
這正是我們預設的報錯方式。

