先說一下,正常如果代碼可以定義成枚舉,我是比較傾向於定義成枚舉的,類似這樣:
public enum Gender { /// <summary> /// 男 /// </summary> [Description("男")] Male = 1, /// <summary> /// 女 /// </summary> [Description("女")] Female = 2, /// <summary> /// 其他 /// </summary> [Description("其他")] Other = 3 }
那么,通常,在代碼中(例如linq),我傾向於用Enum來強制轉為其他類型,這樣如果我要增加一個枚舉或者修改一個枚舉的名字,那么我很容易查到有多少需要修改的地方,所以我對於那種“定義了枚舉,卻在用的時候寫死的,諸如p.Gender=1這類的”代碼是很痛恨的,因為如果需要修改,你不知道有多少地方需要修改,所以一般我的用法是:如果需要int,那就
(int)Gender.Male;
這樣子用,需要修改的時候,只要改了枚舉定義,然后alt+shift+F10即可。。。
說明一下,我們項目里面用的EF+MySQL,MySQL里面的類型定義成了INT(4),這樣的話,到了Entity里面映射成的是sbyte類型,那么我們的代碼就寫成了這樣:
public enum Status : sbyte { /// <summary> /// 正常 /// </summary> [Description("正常")] Normal = 1, /// <summary> /// 凍結 /// </summary> [Description("凍結")] Frozen = 2 }
繼承自sbyte
在這里說明一下,我們這里用到一個叫QueryBuilder的東西,所以需要加linq查詢的條件的時候是這樣的:
deviceCondition.Equals(d => d.Status, ((sbyte)Status.Normal).ToString());
但是最初我用的時候不是這樣的,當時可能腦子抽了,為了不強制轉換,我寫成了這樣:
deviceCondition.Equals(d => d.Status, Status.Normal.GetHashCode().ToString());
看到了什么區別么?就是GetHashCode(),我在用之前甚至在另外的地方驗證了一下,確認Gender.Male.GetHashCode().ToString()返回的是1,是我要的結果,但是等到MySQL查詢不出來數據,讓我一直以為是那個QueryBuilder的In條件篩選針對DateTime類型的問題,后來才發現,Status.Normal.GetHashCode().ToString()返回的並不是我要的1,而是一個四位的數字的時候,我意識到不是QueryBuilder的問題了。
原來,如果你的Enum沒有繼承自sbyte的時候,或者繼承自Int的時候是沒有問題的(Enum默認繼承自Int?),但是,當繼承自其他類型的時候,就不一定了。。。
最后,以后還是強制轉換吧,既可以在編碼的時候就暴露出錯誤,也方便在修改的時候,把用到的地方一次全部修改。。。