C# 是否可以按类型循环遍历枚举?
我正在从Enum制作几个下拉列表。例如,午休枚举的长度将添加如下下拉列表项: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() }); } 其
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()){
}