通过订购

时间:2018-03-13 12:19:28

标签: c# enums

我有一个扩展方法,我可以使用它将枚举转换为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();
}

1 个答案:

答案 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;
}