C# 是否可以按类型循环遍历枚举?

C# 是否可以按类型循环遍历枚举?,c#,enums,extension-methods,C#,Enums,Extension Methods,我正在从Enum制作几个下拉列表。例如,午休枚举的长度将添加如下下拉列表项: foreach (LunchBreak type in Enum.GetValues(typeof(LunchBreak))) { items.Add(new SelectListItem() { Text = SiteUtilities.GetEnumDescription(type), Value = ((int)type).ToString() }); } 其

我正在从Enum制作几个下拉列表。例如,午休枚举的长度将添加如下下拉列表项:

foreach (LunchBreak type in Enum.GetValues(typeof(LunchBreak)))
{
    items.Add(new SelectListItem()
    {
       Text = SiteUtilities.GetEnumDescription(type),
       Value = ((int)type).ToString()
    });
}
其中,我的枚举的形式为:

public enum LunchBreak : int
{
    [Description("20 minutes paid")]
    Paid_20 = 0,

    [Description("20 minutes unpaid")]
    Unpaid_20 = 1
}
有没有办法使foreach循环通用,这样我就可以传入
typeof(午餐时间)
这样我就不必为所有其他枚举重做代码

我试着把它写在我可以直接进入午餐时间的地方,但后来它抱怨我使用枚举作为一种类型

我试着做一个像这里这样的扩展方法,这样我就可以调用像
午餐时间.GetSelectListItems(“请选择午餐时间…”)这样的东西了。
我看了几篇类似这样的文章:但是我没有真正了解到底发生了什么

扩展尝试

public static class EnumExtensions
{
    public static List<SelectListItem> GetSelectListItems<T>(string defaultValue) where T : struct, IConvertible
    {
        if (typeof(T).IsEnum)
        {
            List<SelectListItem> items = new List<SelectListItem>()
            {
                new SelectListItem()
                {
                    Text = defaultValue,
                    Value = string.Empty
                }
            };

            foreach (T item in Enum.GetValues(typeof(T)))
            {
                items.Add(new SelectListItem()
                {
                    Text = SiteUtilities.GetEnumDescription(item), // this line fails as item is expected to be of type Enum
                    Value = ((int)item).ToString()  // this line fails as I can't cast item as an int
                });
            }

            return items;
        }

        throw new ArgumentException("T must be an enumerated type"); 
    }
}
公共静态类枚举扩展
{
公共静态列表GetSelectListItems(字符串默认值),其中T:struct,IConvertible
{
if(类型(T).IsEnum)
{
列表项=新列表()
{
新建SelectListItem()
{
Text=defaultValue,
Value=string.Empty
}
};
foreach(Enum.GetValues中的T项(typeof(T)))
{
items.Add(新建SelectListItem()
{
Text=SiteUtilities.GetEnumDescription(项),//此行失败,因为项应为Enum类型
Value=((int)item).ToString()//此行失败,因为我无法将项转换为int
});
}
退货项目;
}
抛出新ArgumentException(“T必须是枚举类型”);
}
}

你就快到了。您需要将其强制转换为object,然后再转换为
Enum
。对于转换为
int
,您可以改为使用
Convert.ToInt32

public static class EnumExtensions
{
    public static List<SelectListItem> GetSelectListItems<T>(string defaultValue) where T : struct, IConvertible
    {
        if (!typeof (T).IsEnum)
            throw new ArgumentException("T must be an enumerated type");

        List<SelectListItem> items = new List<SelectListItem>()
        {
            new SelectListItem()
            {
                Text = "Please select a lunch break...",
                Value = string.Empty
            }
        };

        foreach (T item in Enum.GetValues(typeof(T)))
        {
            items.Add(new SelectListItem()
            {
                Text = SiteUtilities.GetEnumDescription((Enum)(object)item),
                Value = Convert.ToInt32(item).ToString()
            });
        }

        return items;
    }
}
公共静态类枚举扩展
{
公共静态列表GetSelectListItems(字符串默认值),其中T:struct,IConvertible
{
if(!typeof(T).IsEnum)
抛出新ArgumentException(“T必须是枚举类型”);
列表项=新列表()
{
新建SelectListItem()
{
Text=“请选择午餐休息时间…”,
Value=string.Empty
}
};
foreach(Enum.GetValues中的T项(typeof(T)))
{
items.Add(新建SelectListItem()
{
Text=SiteUtilities.GetEnumDescription((枚举)(对象)项),
Value=Convert.ToInt32(项).ToString()
});
}
退货项目;
}
}

注意:您没有使用参数
defaultValue
您可能需要去掉它,我认为
SelectListItem.Value
必须是
int
,才能更有意义。

这样做应该可以(我不知道
GetEnumDescription
原型-但它可以简单地期望一个对象并反映它。):

公共静态IEnumerable GetSelectListItems(字符串默认值)
{
if(!typeof(T).IsEnum)
抛出新异常(“不是枚举”);
返回新的SelectListItem
{
Text=defaultValue,
Value=string.Empty
};
foreach(Enum.GetValues中的变量项(typeof(T))
{
返回新的SelectListItem
{
Text=SiteUtilities.GetEnumDescription((枚举)项),
Value=Convert.ChangeType(item,typeof(T).GetEnumUnderlyingType().ToString())//并非所有枚举都是int的
}
}
}
如果需要,您可以使用包装器
ToList()
将其删除。

下面的代码可以正常工作

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;


namespace ConsoleApplication28
{
    class Program
    {
        public enum LunchBreak : int
        {
            Paid_20 = 0,
            Unpaid_20 = 1,
        }
        static void Main(string[] args)
        {
            foreach (LunchBreak type in Enum.GetValues(typeof(LunchBreak)))
            {
                LunchBreak LunchItem = type;

            }

        }
    }
}

下面是一个简单的扩展,我将使用它构建任何“枚举循环”:

扩展

public static class EnumExtension
    {
        public static IEnumerable<T> GetValues<T>(this T e)
        {
            return Enum.GetValues(e.GetType()).Cast<T>();
        }
}
public static class EnumExtension
    {
        public static IEnumerable<T> GetValues<T>(this T e)
        {
            return Enum.GetValues(e.GetType()).Cast<T>();
        }
}
foreach(var t in new MyEnum().GetValues()){

}