(這就是此篇最 “複雜”的Enum應用結果示意:使用Char定義、且可以序列&反序列化) (ref from :http://bit.ly/2LnBjLc)
緣起:
什麼是列舉的最佳寫法?「Value To Enum」、「Enum To Value」
在寫Enum轉換時,總是會做下述的判斷:
a. 判斷value是否在定義之中? (Enum.IsDefine(xxx))
b. value Parse為Enum (Enum.Parse)
而這之中,是有「陷阱」的! (請繼續往下看…..)
因此,整理這一篇 針對 Enum 的程式開發 技巧。
使用情境:
基本模式:
資料庫的Type欄位,有1、2、3 等數值型的資料,
而在程式開發時,想要用 列舉 Enum 規範住 所允許的 範圍值。
進階模式:
資料庫的Type欄位,有 A、B、C 等非數值型的字元資料,
而在程式開發時,想要用 列舉 Enum 規範住 所允許的 範圍值。
重點:
■ 基本的Enum判斷 &寫法 (基本款)
■ 進階的Enum使用Char的定義方式之 判斷&寫法 (進階款)
基本模式 - 值與列舉的轉換
public enum MyEnum{
None,
Item1,
Item2
}
基本的判斷方式(db欄位值轉為Enum):
Var dbValue = 1;
var myEnum = (Enum.IsDefined(typeof(MyEnum), dbValue) ?
(MyEnum)Enum.Parse<MyEnum>(dbValue.ToString()) :
(MyEnum.None));
基本的取值方式(Enum轉為db欄位值):
var dbValue = (int) model.XXXX;
基本模式 – Enum.IsDefined(xxx) 的陷阱 - 要輸入”數字”的
這就是Enum的陷阱!!!
(Enum.IsDefined(typeof(MyEnum), 1) //true
(Enum.IsDefined(typeof(MyEnum), "1") //false
就是 Enum.IsDefined( ) 內部的參數值,是要「數字」的!!不然它都會 get false .
基本模式 – Enum.Parse(xxx) 的陷阱 - 要輸入”文字”的
Var dbValue = 1;
(MyEnum)Enum.Parse<MyEnum>(dbValue.ToString())
進階模式 - 使用「Char」來代表列舉值
(這還不是正確寫法)
public enum MyEnum{
None = ‘-1’,
Item1 = ‘A’,
Item2 = ‘B’
}
(正確寫法 - 這樣Json序列化 才可以傳入 ‘A’字串)
using System.Runtime.Serialization;
[JsonConverter(typeof(StringEnumConverter))]
public enum MyEnum{
[EnumMember(Value="-1")]
None = '-1',
[EnumMember(Value="A")]
Item1 = 'A',
[EnumMember(Value="B")]
Item2 = 'B'
}
進階模式下 - 使用 Enum.IsDefined(XXX)
一定要轉成為Int
Enum.IsDefined(typeof(MyEnum),(int)'A')
進階模式下 - 使用 Enum.Parse(XXX)
一定要轉成為字串
(MyEnum)Enum.Parse<MyEnum>(((int)'A').ToString())
進階模式下 - 整合應用
Enum.IsDefined(typeof(MyEnum), dbValue ); //true
(MyEnum)Enum.Parse<MyEnum>(dbValue.ToString())
判斷方式(db欄位值轉為Enum):
var dbValue = (int)Convert.ToChar("A"); //先轉為Char,再轉為Int
var myEnum = (Enum.IsDefined(typeof(MyEnum), dbValue ))?
(MyEnum)Enum.Parse<MyEnum>(dbValue.ToString()) :
(MyEnum.None));
判斷方式(Enum轉為Db欄位值):
var dbValue = ((char) model.XXXX).ToString(); //got “A”
這樣的寫法,就可以取得它的字元值
(THE END)
0 意見 :
張貼留言