.net工具类 获取枚举类型的描述
程序员文章站
2022-06-01 20:33:18
一般情况我们会用枚举类型来存储一些状态信息,而这些信息有时候需要在前端展示,所以需要展示中文注释描述。 为了方便获取这些信息,就封装了一个枚举扩展类。 上面代码中的 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();
好了,这样前端就能拿到订单状态描述信息了,是不是很方便。