如何在C#中枚举枚举?
例如,以下代码无法编译:
public enum Suit
{
Spades,
Hearts,
Clubs,
Diamonds
}
public void EnumerateAllSuitsDemoMethod()
{
foreach (Suit suit in Suit)
{
DoSomething(suit);
}
}
它给出了以下编译时错误:
“Suit”是“type”,但与“variable”类似
它在第二个Suit关键字上失败。
当你有这样的枚举时
enum DemoFlags
{
DemoFlag = 1,
OtherFlag = 2,
TestFlag = 4,
LastFlag = 8,
}
有了这个任务
DemoFlags demoFlags = DemoFlags.DemoFlag | DemoFlags.TestFlag;
需要这样的结果
"DemoFlag | TestFlag"
此方法有助于:
public static string ConvertToEnumString<T>(T enumToConvert, string separator = " | ") where T : Enum
{
StringBuilder convertedEnums = new StringBuilder();
foreach (T enumValue in Enum.GetValues(typeof(T)))
{
if (enumToConvert.HasFlag(enumValue)) convertedEnums.Append($"{ enumValue }{separator}");
}
if (convertedEnums.Length > 0) convertedEnums.Length -= separator.Length;
return convertedEnums.ToString();
}
如果您知道类型将是枚举,但在编译时不知道确切的类型是什么,该怎么办?
public class EnumHelper
{
public static IEnumerable<T> GetValues<T>()
{
return Enum.GetValues(typeof(T)).Cast<T>();
}
public static IEnumerable getListOfEnum(Type type)
{
MethodInfo getValuesMethod = typeof(EnumHelper).GetMethod("GetValues").MakeGenericMethod(type);
return (IEnumerable)getValuesMethod.Invoke(null, null);
}
}
getListOfEnum方法使用反射获取任何枚举类型,并返回所有枚举值的IEnumerable。
用法:
Type myType = someEnumValue.GetType();
IEnumerable resultEnumerable = getListOfEnum(myType);
foreach (var item in resultEnumerable)
{
Console.WriteLine(String.Format("Item: {0} Value: {1}",item.ToString(),(int)item));
}
新的.NET 5解决方案:
.NET 5为GetValues方法引入了新的通用版本:
Suit[] suitValues = Enum.GetValues<Suit>();
这是目前为止最方便的方法。
foreach循环中的用法:
foreach (Suit suit in Enum.GetValues<Suit>())
{
}
如果您只需要枚举名作为字符串,则可以使用通用的GetNames方法:
string[] suitNames = Enum.GetNames<Suit>();