一般情況我們會用枚舉類型來存儲一些狀態信息,而這些信息有時候需要在前端展示,所以需要展示中文註釋描述。 為了方便獲取這些信息,就封裝了一個枚舉擴展類。 上面代碼中的 ComboboxItemDto 類是來自 Abp 源碼,它主要用於提供前端下拉框的數據源。 好了,下麵來舉個慄子,這是一個訂單枚舉類 ...
一般情況我們會用枚舉類型來存儲一些狀態信息,而這些信息有時候需要在前端展示,所以需要展示中文註釋描述。
為了方便獲取這些信息,就封裝了一個枚舉擴展類。
/// <summary> /// 枚舉擴展類 /// </summary> public static class EnumExtension { /// <summary> /// 獲取枚舉的描述,需要DescriptionAttribute屬性 /// </summary> /// <param name="e"></param> /// <returns></returns> public static string GetDescription(this Enum e) { //獲取枚舉的Type類型對象 var type = e.GetType(); //獲取枚舉的所有欄位 var fields = type.GetFields(); //遍歷所有枚舉的所有欄位 foreach (var field in fields) { if (field.Name != e.ToString()) { continue; } //第二個參數true表示查找EnumDisplayNameAttribute的繼承鏈 if (field.IsDefined(typeof(DescriptionAttribute), true)) { var attr = field.GetCustomAttribute(typeof(DescriptionAttribute), false) as DescriptionAttribute; if (attr != null) { return attr.Description; } } } //如果沒有找到自定義屬性,直接返回屬性項的名稱 return e.ToString(); } /// <summary> /// 根據枚舉獲取下拉框列表 /// </summary> /// <param name="en"></param> /// <returns></returns> public static List<ComboboxItemDto> GetSelectList(this Enum en) { var list = new List<ComboboxItemDto>(); foreach (var e in Enum.GetValues(en.GetType())) { list.Add(new ComboboxItemDto() { DisplayText = GetDescription(e as Enum), Value = ((int)e).ToString(), IsSelected = e == en }); } return list; } /// <summary> /// 根據枚舉獲取下拉框列表 /// </summary> /// <param name="type">枚舉類型</param> /// <returns></returns> public static List<ComboboxItemDto> GetSelectList(this Type type) { var list = new List<ComboboxItemDto>(); foreach (var e in Enum.GetValues(type)) { list.Add(new ComboboxItemDto() { DisplayText = GetDescription(e as Enum), Value = ((int)e).ToString() }); } return list; } }
上面代碼中的 ComboboxItemDto 類是來自 Abp 源碼,它主要用於提供前端下拉框的數據源。
// // 摘要: // This DTO can be used as a simple item for a combobox/list. public class ComboboxItemDto { // // 摘要: // Creates a new Abp.Application.Services.Dto.ComboboxItemDto. public ComboboxItemDto(); // // 摘要: // Creates a new Abp.Application.Services.Dto.ComboboxItemDto. // // 參數: // value: // Value of the item // // displayText: // Display text of the item public ComboboxItemDto(string value, string displayText); // // 摘要: // Value of the item. public string Value { get; set; } // // 摘要: // Display text of the item. public string DisplayText { get; set; } // // 摘要: // Is selected? public bool IsSelected { get; set; } }
好了,下麵來舉個慄子,這是一個訂單枚舉類
/// <summary> /// 商品訂單狀態 /// </summary> public enum CommodityOrderState { /// <summary> /// 待付款 /// </summary> [Description("待付款")] PendingPay, /// <summary> /// 待發貨 /// </summary> [Description("待發貨")] PendingShip, /// <summary> /// 待收貨 /// </summary> [Description("待收貨")] PendingReceipt, /// <summary> /// 待評價 /// </summary> [Description("待評價")] PendingEvaluation, /// <summary> /// 已評價 /// </summary> [Description("已評價")] Evaluated, /// <summary> /// 已退款 /// </summary> [Description("已退款")] Refunded = 100 }
這是一個訂單DTO,一般會存在訂單狀態欄位,就像這樣。
/// <summary> /// 訂單狀態(這個欄位會通過AutoMapper自動映射) /// </summary> public CommodityOrderState State { get; set; } /// <summary> /// 訂單狀態描述 /// </summary> public string StateDesc => State.GetDescription();
好了,這樣前端就能拿到訂單狀態描述信息了,是不是很方便。