使用 EnumToList<T> 时如何将 <T> 转换为 Enum

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

我有一个简单的 class SelectItemOption,通常用于下拉菜单、列表等。

public class SelectItemOption
{
    public string Title { get; set; }
    public string ID { get; set; }
    public string Description { get; set; }
}

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

我从 another SO answer 中窃取了一些代码,以将枚举值放入可枚举对象中。

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

我试图像这样把它们放在一起:

    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<T>()),我会得到 "cannot convert type T to system.enum"。

但是,如果我使用 foreach (var option in EnumToList<T>()),我的扩展方法将无法识别。

如果我尝试在 foreach 语句后将 option 转换为枚举,我会得到 "cannot implicitly convert type T to system.enum"。

啊啊啊啊啊啊!

您不能限制为 Enum,因此 option 只能是 struct。但是,您可以尝试像这样编写 EnumAsSelectItemOptions 方法:

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