2018/12/18

20181218-程式-C# Enum 列舉的超級應用 整理

image

(這就是此篇最 “複雜”的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())



進階模式下 - 整合應用


var dbValue = (int)Convert.ToChar("A"); //先轉為Char,再轉為Int
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”


這樣的寫法,就可以取得它的字元值

clip_image001


(THE END)

0 意見 :

張貼留言