实现:
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<KeyValue> GetSelectList(this Enum en)
{
var list = new List<KeyValue>();
foreach (var e in Enum.GetValues(en.GetType()))
{
list.Add(new KeyValue() { Value = GetDescription(e as Enum), Key = ((int)e).ToString(), IsSelected = e.ToString() == en.ToString() });
}
return list;
}
}
public class KeyValue {
public string Key { get; set; }
public string Value { get; set; }
public bool IsSelected { get; set; }
}
调用:
class Program
{
static void Main(string[] args)
{
var list = OrderState.NoPay.GetSelectList();
foreach (var item in list)
{
string str = string.Format("Key:{0},Value:{1},Selected:{2}", item.Key, item.Value, item.IsSelected);
Console.WriteLine(str);
}
Console.ReadKey();
}
}
public enum OrderState
{
[Description("未付款")]
NoPay = 0,
[Description("支付成功")]
PaySuccess = 1,
[Description("支付失败")]
PayError = 2,
[Description("已退款")]
PayReturn = 3
}
结果: