在.NET中,枚舉一般有兩種常見用法,一是表示唯一的元素序列,比如表示訂單狀態(未提交,待處理,處理中...)。另外一種是表示多種組合的狀態,比如表示權限,因為可同時有多個不同權限。
這里拿項止中訂單的訂單狀態來舉例。
1,使用枚舉表示訂單的訂單狀態,并保存到數據庫
public void SaveOrder() { using (var db = new HotelDBEntities()) { var order = new EFHotelOrder { OrderID = 10000, OrderStatus = (byte)OrderStatusType.NotSubmit//訂單狀態 }; db.HotelOrderSet.Add(order); db.SaveChanges(); } }
/// <summary> /// 訂單狀態 /// </summary> [DataContract, Serializable] public enum OrderStatusType : byte { /// <summary> /// 未提交 /// </summary> [Description("未提交")] [EnumMember] NotSubmit = 0, /// <summary> /// 待處理 /// </summary> [Description("待處理")] [EnumMember] WaitingPRocess = 1, /// <summary> /// 處理中 /// </summary> [Description("處理中")] [EnumMember] Processing = 2, /// <summary> /// 預訂成功 /// </summary> [Description("預訂成功")] [EnumMember] BookingSuccess = 3 }
2,從數據庫讀取訂單狀態,并轉化成相應枚舉
var orderStatus= order.OrderStatus.ToEnum<LocalHotelOrderStatusType>();//ToEnum是擴展方法
為了說明表示多種組合狀態,拿用戶擁有的權限來說明。此時需要在枚舉上加[Flags]特性來標記位域。
1,枚舉的定義
/// <summary> /// 權限枚舉 /// </summary> [Flags] [DataContract, Serializable] public enum Permission : int { //[Description("未知")] [EnumMember] Unknown = 0,//也可以寫成0x00或0 //[Description("創建")] [EnumMember] Create = 1 << 0,//0x01或1 //[Description("讀取")] [EnumMember] Read = 1 << 1,//0x02或2 //[Description("修改")] [EnumMember] Update = 1 << 2,//0x04或4 //[Description("刪除")] [EnumMember] Delete = 1 << 3//0x08或8 }
注意加了[Flags]特性后有三種寫法,一種是使用<<符號,第二種是0x01,還有一種是直接寫0,1,2,4,8...,一般來說是2的n次方來表示。
2,使用
//1,給用戶創建,讀取,修改和刪除的權限 var permission = Permission.Create | Permission.Read | Permission.Update | Permission.Delete; //2,去掉用戶的修改和刪除權限 permission = permission & ~Permission.Update;//permission = permission ^ Permission.Update;這種寫法有bug,如果重復執行又加回去了 permission = permission & ~Permission.Delete; //3,給用戶加上修改的權限 permission = permission | Permission.Update; //4,判斷用戶是否有創建的權限 var isCreate = (permission & Permission.Create) != 0;//或者var isCreate =(permission & Permission.Create)== Permission.Create
保存到數據庫的時候轉換成int類型保存。
在數據庫中可以這樣來判斷:
AND (@permission IS NULL OR (permission & @permission) =@permission)
新聞熱點
疑難解答