关于C#:使用EnumToList 时,如何将转换为Enum

How can I cast <T> as Enum when using EnumToList<T>

我有一个简单的类SelectItemOption,它一般用于下拉列表、列表等。

1
2
3
4
5
6
public class SelectItemOption
{
    public string Title { get; set; }
    public string ID { get; set; }
    public string Description { get; set; }
}

我想创建一个方法,用枚举中的值填充ListGetDisplayName()GetDisplayDescription()从属性中获取此信息。

我从另一个so-answer中抢走了一些代码,以便将枚举值转换为可枚举的。

1
2
3
4
5
    public static IEnumerable<T> EnumToList<T>()
        where T : struct
    {
        return Enum.GetValues(typeof(T)).Cast<T>();
    }

我正试图把所有这些都按如下方式放在一起:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public static List<SelectItemOption> EnumAsSelectItemOptions<T>()
        where T : struct
    {
        var optionsList = new List<SelectItemOption>();
        foreach (var option in EnumToList<T>())   //** headache here **
        {
            optionsList.Add(new SelectItemOption()
            {
                Title = option.GetDisplayName(),
                ID = option.ToString(),
                Description = option.GetDisplayDescription()
            });
        }
        return optionsList;
    }

当我尝试迭代EnumTolist时,会出现问题。

无论我怎么尝试,我似乎都无法让option变量像枚举一样工作。

我试过…

如果我使用foreach (Enum option in EnumToList()),我会得到"cannot convert type t to system.enum"。

但如果我使用foreach (var option in EnumToList()),我的扩展方法就不被认可了。

如果我尝试在foreach语句后将option强制转换为枚举,我得到"无法将类型t隐式转换为System.Enum"。

啊!


不能像Enum那样约束,所以option只能是struct。但是,您可以尝试编写这样的EnumAsSelectItemOptions方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static List<SelectItemOption> EnumAsSelectItemOptions<T>()
    where T : struct
{
    var optionsList = new List<SelectItemOption>();
    foreach (var option in EnumToList<T>())   //** headache here **
    {
        optionsList.Add(new SelectItemOption()
        {
            Title = option is Enum
                ? (option as Enum).GetDisplayName()
                : option.ToString(),
            ID = option.ToString(),
            Description = option is Enum
                ? (option as Enum).GetDisplayDescription()
                : option.ToString(),
        });
    }
    return optionsList;
}