閱讀目錄web
枚舉在什麼地方適用呢?一條廣泛規則是,任何使用常量的地方,例如目前用 switch 代碼切換常量的地方。若是隻有單獨一個值(例如,鞋的最大尺寸,或者籠子中能裝猴子的最大數目),則仍是把這個任務留給常量吧。可是,若是定義了一組值,而這些值中的任何一個均可以用於特定的數據類型,那麼將枚舉用在這個地方最適合不過。 數據庫
例1:一個字段表示類型。你可使用整數1、2、3表明原創、轉載、翻譯三種類型。這種表示法可使用,但它不直觀。此時應該使用枚舉。 數據結構
例2:表示星期的SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY,SATURDAY, 就是應該定義成一個枚舉。
ui
一、 對於沒有賦值的枚舉類型,聲明的第一個枚舉成員它的默值爲零。之後的枚舉成員值是將前一個枚舉成員(按照文本順序)的值加1獲得的。 this
2 、容許多個枚舉成員有相同的值。沒有顯示賦值的枚舉成員的值,老是前一個枚舉成員的值+1。 spa
3、使用方法 .net
.NET中的枚舉咱們通常有兩種常見用法,一是表示惟一的元素序列,例如一週裏的各天,訂單狀態,文章類型等;還有就是用來表示多種複合的狀態,例如表示權限,由於可同時有多個不一樣權限。 翻譯
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
using System; using System.ComponentModel; using System.Reflection; using System.Collections.Generic; using System.Data.SqlClient; using System.Data; namespace MyLaboratory { /// <summary> /// 訂單狀態的枚舉類型 /// </summary> public enum ArticleType { /// <summary> /// 原創 /// </summary> [Description("原創")] Original = 1, /// <summary> /// 翻譯 /// </summary> [Description("翻譯")] Translate = 2, /// <summary> /// 轉載 /// </summary> [Description("轉載")] Reproduced = 3 } /// <summary> /// 文章類,此處簡化了,爲了演示只設計了三個字段 /// </summary> public class Article { private int _id; private string _title = ""; private ArticleType _type; /// <summary> /// 文章編號 /// </summary> public int ID { get { return _id; } set { _id = value; } } /// <summary> /// 文章標題 /// </summary> public string Title { get { return _title; } set { _title = value; } } /// <summary> /// 文章類型 /// </summary> public ArticleType Type { get { return _type; } set { _type = value; } } /// <summary> /// 添加一篇文章 /// </summary> /// <returns></returns> public bool Add() { //影響的行數 int EffectRow = 0; using (SqlConnection conn = new SqlConnection("數據庫鏈接串")) { SqlCommand cmd = new SqlCommand("INSERT INTO Article(ID,Title,Type) VALUES(@ID,@Title,@Type)", conn); cmd.Parameters.Add(new SqlParameter("@ID", this._id)); cmd.Parameters.Add(new SqlParameter("@Title", this._title)); cmd.Parameters.Add(new SqlParameter("@Type", this._type)); //枚舉屬性直接使用便可 conn.Open(); EffectRow = cmd.ExecuteNonQuery(); } return EffectRow == 1 ? true : false; } /// <summary> /// 獲取文章的詳情 /// </summary> public void GetInfo() { //從數據庫中讀取訂單信息 DataSet ds = new DataSet(); using (SqlConnection conn = new SqlConnection("數據庫鏈接串")) { SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Article WHERE ID=@ID", conn); da.SelectCommand.Parameters.Add(new SqlParameter("@ID", this._id)); conn.Open(); da.Fill(ds, "Article"); } if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) { //將字符串轉化成枚舉類型 this._type = (ArticleType)Enum.Parse(typeof(ArticleType), ds.Tables[0].Rows[0]["Type"].ToString()); this._title = ds.Tables[0].Rows[0]["Title"].ToString(); } } } } |
爲了說明表示多種組合狀態,拿用戶的權限來舉例。此時須要在枚舉上加[Flags]特性來標記位域。 設計
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/// <summary> /// 權限枚舉 /// </summary> [Flags] public enum Permission { [Description("未知")] Unknown = 0,//也能夠寫成0x00或0 [Description("建立")] Create = 1 << 0,//0x01或1 [Description("讀取")] Read = 1 << 1,//0x02或2 [Description("修改")] Update = 1 << 2,//0x04或4 [Description("刪除")] Delete = 1 << 3//0x08或8 } |
注意加了[Flags]特性後有三種寫法,一種是使用<<符號,第二種是0x01,還有一種是直接寫0,1,2,4,8...,通常來講是2的n次方來表示。 orm
1
2 3 4 5 6 7 8 9 10 11 12 13 14 |
//1,給用戶建立,讀取,修改和刪除的權限 var permission = Permission.Create | Permission.Read | Permission.Update | Permission.Delete; //2,去掉用戶的修改和刪除權限 //permission = permission ^ Permission.Update;這種寫法有bug,若是重複執行又加回去了 permission = permission & ~Permission.Update; permission = permission & ~Permission.Delete; //3,給用戶加上修改的權限 permission = permission | Permission.Update; //4,判斷用戶是否有建立的權限 var isCreate = (permission & Permission.Create) != 0; //或者var isCreate =(permission & Permission.Create)== Permission.Create |
這時permission枚舉的值將變成 0+1+4=5,它的ToString()將變成"Permission.Create , Permission.Read,Permission.Update"
這裏咱們能夠解釋爲何第五個值Delete是8.而不能爲5。也就是說它的值不該該是前幾項值的複合值。一個比較簡單的方法就是用2的n次方來依次爲每一項賦值,例如 1,2,4,8,16,32,64.....
在數據庫中能夠這樣來判斷:
AND (@permission IS NULL OR (permission & @permission) =@permission)
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
@{
if (ViewBag.List != null) { List<MyLaboratory.Article> list = (List<MyLaboratory.Article>)ViewBag.list; foreach (Article article in list) { string TypeName = ""; if (article.Type == 1) { TypeName = "原創"; } else if (article.Type == 2) { TypeName = "翻譯"; } else if (article.Type == 3) { TypeName = "轉載"; } <tr>
<td>@article.ID</td> <td>@article.Title</td> <td>@TypeName</td> </tr> } } } |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class Utility { /// <summary> /// 獲取一個枚舉值的中文描述 /// </summary> /// <param name="obj">枚舉值</param> /// <returns></returns> public static string GetEnumDescription(Enum obj) { FieldInfo fi = obj.GetType().GetField(obj.ToString()); DescriptionAttribute[] arrDesc = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false); return arrDesc[0].Description; } } |
2)、調用的代碼以下(ASP.NET MVC)
1
2 3 4 5 6 7 8 9 10 11 12 13 14 |
@{
if (ViewBag.List != null) { List<MyLaboratory.Article> list = (List<MyLaboratory.Article>)ViewBag.list; foreach (MyLaboratory.Article article in list) { <tr>
<td>@article.ID</td> <td>@article.Title</td> <td>@MyLaboratory.Utility.GetEnumDescription(article.Type)</td> </tr> } } } |
1
2 3 4 5 |
<select id="Type" name="Type"> <option value="1">原創</option> <option value="2">翻譯</option> <option value="3">轉載 </option> </select> |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/// <summary> /// 獲取文章類型的枚舉的鍵/值字典 /// </summary> /// <returns></returns> public static Dictionary<int, string> GetTypeDict() { Dictionary<int, string> dict = new Dictionary<int, string>(); Type t = typeof(ArticleType); Array arrays = Enum.GetValues(t); for (int i = 0; i < arrays.LongLength; i++) { ArticleType tmp = (ArticleType)arrays.GetValue(i); string Description = Utility.GetEnumDescription(tmp); dict.Add((int)tmp, Description); } return dict; } |
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<select id="Type" name="Type"> @{ Dictionary<int, string> dict = MyLaboratory.Utility.GetStatusDict(); if (dict.Count > 0) { foreach (KeyValuePair<int, string> kvp in dict) { if (kvp.Key != 0) { <option value="@kvp.Key">@kvp.Value</option> } } } } </select> |