我正在作一個出入庫管理的簡單項目,在Models裏定義了這樣的枚舉類型html
public enum InOrOut { [Description("出庫")] Out = 0, [Description("入庫")] In = 1 }
我想在輸入參數爲數據庫字段值1或者0的時候,在頁面上顯示爲枚舉Name:In、Out,或者乾脆顯示爲Description:出庫、入庫。數據庫
獲取枚舉Name其實很簡單:this
return Enum.GetName(typeof(InOrOut), value).ToString());
爲了能在視圖裏經過調用@Html.DisplayInOrOut(item.InOrOut)的方式顯示該枚舉類型的Name,我擴展了HtmlHelper,在Controllers中增長一個HtmlExtensions.cs,在裏面新增了一個EnumExtensions類,注意命名空間爲System.Web.Mvc,這樣才能在視圖裏以@Html.的方式調用:spa
namespace System.Web.Mvc { public static class EnumExtensions { //顯示Enum類型的Name值 public static MvcHtmlString DisplayInOrOut(this HtmlHelper htmlHelper, int value) return MvcHtmlString.Create(Enum.GetName(typeof(StockInOrOut), value).ToString()); } ... }
@Html.DisplayInOrOut(1)在視圖裏顯示出來就是"In",可若是咱們要顯示的是中文的Description呢?翻譯
通常來講,若是不用[Descript]標籤的話,咱們須要編寫一個翻譯器,code
public string DisplayInOrOutDescription(int value) { InOrOut obj=(InOrOut)value; string result = string.Empty; switch (obj) { case InOrOut.In: result = "入庫"; break; case InOrOut.Out: result = "出庫"; break; default: result = ""; break; } return result; }
既然C#語言爲咱們描述數據接口的時候DescriptionAttribute標籤,爲何很差好利用呢?htm
增長這個命名空間:blog
using System.ComponentModel;
將方法改形成:接口
//顯示Enum類型的Description值(若是有)或者Name值 public static MvcHtmlString DisplayInOrOut(this HtmlHelper htmlHelper, int value) { if (!Enum.IsDefined(typeof(InOrOut), value)) { return MvcHtmlString.Empty; } StockInOrOut obj = (InOrOut)value; DescriptionAttribute[] EnumAttributes = (DescriptionAttribute[])(obj.GetType().GetField(obj.ToString())).GetCustomAttributes(typeof(DescriptionAttribute), false); if (EnumAttributes.Length > 0) { return MvcHtmlString.Create(EnumAttributes[0].Description); } return MvcHtmlString.Create(obj.ToString()); }
這樣在視圖裏出來的效果就是枚舉類型裏頭定義的Description了:"出庫""入庫",還不影響數據庫裏的整型字段,又不影響程序裏頭的io=InOrOut.In這樣的表述,多爽!ip
但是若是個人項目裏頭定義了多個枚舉類型,好比還有一個操做狀態:
public enum LogStatus { [Description("操做未肯定")] UnConfirmed = -1, [Description("操做取消")] Cancel = 0, [Description("操做已肯定")] Confirmed = 1 }
那麼也想把數據庫中取得的字段值顯示爲該枚舉的Description或者Name,勢必又要定義一個大部分代碼重複的DisplayLogStatus()的方法,能不能直接把枚舉類型的名稱做爲變量帶進方法呢?在方法裏頭再根據傳入的名稱還原出該枚舉類型來。
我試了能夠用該方法根據枚舉類型的名稱得到枚舉類型:
Type enumType = Type.GetType("MvcApplicationName.Models.InOrOut");
必需要加上你的MvcApplicationName的命名空間,不然返回值爲null,如今返回值是這樣:
enumType {Name = "StockInOrOut" FullName = "MvcApplicationName.Models.StockInOrOut"}
固然還有一堆屬性:
Assembly {MvcApplicationName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null} 等等
咱們利用這個反射回來的類型就能獲得對應名稱的枚舉Name值了:
//顯示Enum類型的Name字段 public static MvcHtmlString DisplayEnumName(this HtmlHelper htmlHelper, string enumTypeName, int value) { Type enumType = Type.GetType("StockManager.Models." + enumTypeName); if (!Enum.IsDefined(enumType, value)) { return MvcHtmlString.Empty; } //若是隻是要簡單的返回枚舉的Name值就只要這一行了 return MvcHtmlString.Create(Enum.GetName(enumType, value)); }
因而我在視圖裏這麼用還挺爽的:
@Html.DisplayEnumName("LogStatus", item.Status) @Html.DisplayEnumName("InOrOut", item.InOrOut)
若是我想把DisplayEnumName改形成可以顯示Description呢?
再增長這個方法:
//顯示Enum類型的Description字段或者Name字段 public static MvcHtmlString DisplayEnumDescription(this HtmlHelper htmlHelper, string enumTypeName, int value) { Type enumType = Type.GetType("StockManager.Models." + enumTypeName); if (!Enum.IsDefined(enumType, value)) { return MvcHtmlString.Empty; } DescriptionAttribute[] EnumAttributes = (DescriptionAttribute[])(enumType.GetField(Enum.GetName(enumType, value))).GetCustomAttributes(typeof(DescriptionAttribute), false); if (EnumAttributes.Length > 0) { return MvcHtmlString.Create(EnumAttributes[0].Description); } //若是隻是要簡單的返回枚舉的Name值就只要這一行了 return MvcHtmlString.Create(Enum.GetName(enumType, value)); }
視圖裏的調用改爲就好了:
@Html.DisplayEnumDescription("LogStatus", item.Status) @Html.DisplayEnumDescription("InOrOut", item.InOrOut)