我有一个扩展方法,我可以使用它将枚举转换为SelectList,我可以将其输入MVC DropDownListFor帮助器。
我的枚举值有一个特定的顺序,但是当在下拉列表中显示值时,我想显示一个单独的顺序。
在这种特殊情况下,我有一个' TaskPriority' enum看起来像这样:
public enum TaskPriority
{
[Display(Order = 2)]
Low,
[Display(Order = 1)]
Normal,
[Display(Order = 3)]
High
}
出于按优先级排序项目的目的,枚举值必须按上述顺序排列。但是,当向用户显示这些枚举值时,我想根据使用MVC DisplayAttribute指定的顺序显示它们,我已经用它来装饰我的枚举。
如何生成一个根据显示属性顺序对枚举进行排序的选择列表?
以下是我现有的用于将枚举转换为SelectLists的扩展程序代码:
public static List<SelectListItem> ToSelectList<T>() where T : struct, IConvertible
{
return Enum.GetValues(typeof(T)).Cast<T>().Select(@enum => new SelectListItem
{
Text = GetDisplayName(@enum),
Value = GetValue(@enum)
}).ToList();
}
private static string GetValue<TEnum>(TEnum @enum) where TEnum : struct, IConvertible
{
return ((int)Enum.Parse(typeof(TEnum), @enum.ToString())).ToString();
}
private static string GetDisplayName<TEnum>(TEnum @enum) where TEnum : struct, IConvertible
{
return @enum.GetType().GetMember(@enum.ToString()).FirstOrDefault()?
.GetCustomAttribute<DisplayAttribute>(false)?.Name ?? @enum.ToString();
}
答案 0 :(得分:2)
我修改了现有代码并添加了一个新的扩展方法:
public static List<SelectListItem> ToOrderedSelectList<TEnum>() where TEnum : struct, IConvertible
{
return Enum.GetValues(typeof(TEnum)).Cast<TEnum>()
.Select(@enum => new
{
enumValue = GetValue(@enum),
order = GetDisplayOrder(@enum),
enumText = GetDisplayName(@enum)
})
.OrderBy(x => x.order)
.Select(x => new SelectListItem
{
Text = x.enumText,
Value = x.enumValue
}
).ToList();
}
private static int GetDisplayOrder<TEnum>(TEnum @enum) where TEnum : struct, IConvertible
{
return @enum.GetType().GetMember(@enum.ToString()).FirstOrDefault()?
.GetCustomAttribute<DisplayAttribute>(false)?.Order ?? 0;
}