我有以下代码:
// Obtain the string names of all the elements within myEnum
String[] names = Enum.GetNames( typeof( myEnum ) );
// Obtain the values of all the elements within myEnum
Array values = Enum.GetValues( typeof( myEnum ) );
// Print the names and values to file
for ( int i = 0; i < names.Length; i++ )
{
print( names[i], values[i] );
}
但是,我无法索引值。有更简单的方法吗?
或者我完全错过了什么!
答案 0 :(得分:191)
Array values = Enum.GetValues(typeof(myEnum));
foreach( MyEnum val in values )
{
Console.WriteLine (String.Format("{0}: {1}", Enum.GetName(typeof(MyEnum), val), val));
}
或者,您可以转换返回的System.Array:
string[] names = Enum.GetNames(typeof(MyEnum));
MyEnum[] values = (MyEnum[])Enum.GetValues(typeof(MyEnum));
for( int i = 0; i < names.Length; i++ )
{
print(names[i], values[i]);
}
但是,你能确定GetValues以与GetNames返回名称相同的顺序返回值吗?
答案 1 :(得分:32)
您需要强制转换数组 - 返回的数组实际上是请求的类型,例如myEnum[]
,如果您要求typeof(myEnum)
:
myEnum[] values = (myEnum[]) Enum.GetValues(typeof(myEnum));
然后values[0]
等
答案 2 :(得分:9)
您可以将该数组转换为不同类型的数组:
myEnum[] values = (myEnum[])Enum.GetValues(typeof(myEnum));
或者如果你想要整数值:
int[] values = (int[])Enum.GetValues(typeof(myEnum));
你可以迭代那些已经铸造的数组:)
答案 3 :(得分:7)
字典列表怎么样?
Dictionary<string, int> list = new Dictionary<string, int>();
foreach( var item in Enum.GetNames(typeof(MyEnum)) )
{
list.Add(item, (int)Enum.Parse(typeof(MyEnum), item));
}
当然你可以将字典值类型更改为你的枚举值。
答案 4 :(得分:5)
另一种解决方案,有趣的可能性:
enum Days { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }
static class Helpers
{
public static IEnumerable<Days> AllDays(Days First)
{
if (First == Days.Monday)
{
yield return Days.Monday;
yield return Days.Tuesday;
yield return Days.Wednesday;
yield return Days.Thursday;
yield return Days.Friday;
yield return Days.Saturday;
yield return Days.Sunday;
}
if (First == Days.Saturday)
{
yield return Days.Saturday;
yield return Days.Sunday;
yield return Days.Monday;
yield return Days.Tuesday;
yield return Days.Wednesday;
yield return Days.Thursday;
yield return Days.Friday;
}
}
答案 5 :(得分:4)
这是另一个。我们需要为EnumValues提供友好的名称。我们使用System.ComponentModel.DescriptionAttribute为每个枚举值显示自定义字符串值。
public static class StaticClass
{
public static string GetEnumDescription(Enum currentEnum)
{
string description = String.Empty;
DescriptionAttribute da;
FieldInfo fi = currentEnum.GetType().
GetField(currentEnum.ToString());
da = (DescriptionAttribute)Attribute.GetCustomAttribute(fi,
typeof(DescriptionAttribute));
if (da != null)
description = da.Description;
else
description = currentEnum.ToString();
return description;
}
public static List<string> GetEnumFormattedNames<TEnum>()
{
var enumType = typeof(TEnum);
if (enumType == typeof(Enum))
throw new ArgumentException("typeof(TEnum) == System.Enum", "TEnum");
if (!(enumType.IsEnum))
throw new ArgumentException(String.Format("typeof({0}).IsEnum == false", enumType), "TEnum");
List<string> formattedNames = new List<string>();
var list = Enum.GetValues(enumType).OfType<TEnum>().ToList<TEnum>();
foreach (TEnum item in list)
{
formattedNames.Add(GetEnumDescription(item as Enum));
}
return formattedNames;
}
}
使用中
public enum TestEnum
{
[Description("Something 1")]
Dr = 0,
[Description("Something 2")]
Mr = 1
}
static void Main(string[] args)
{
var vals = StaticClass.GetEnumFormattedNames<TestEnum>();
}
这将结束返回“Something 1”,“Something 2”
答案 6 :(得分:3)
使用foreach循环怎么样,也许你可以使用它?
int i = 0;
foreach (var o in values)
{
print(names[i], o);
i++;
}
或许那样的东西?
答案 7 :(得分:3)
老问题,但使用LINQ .Cast<>()
var values = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>();
foreach(var val in values)
{
Console.WriteLine("Member: {0}",val.ToString());
}
答案 8 :(得分:2)
Array有一个GetValue(Int32)方法,可用于检索指定索引处的值。
答案 9 :(得分:2)
您可以使用格式字符串简化此操作。我在使用消息中使用以下代码段:
writer.WriteLine("Exit codes are a combination of the following:");
foreach (ExitCodes value in Enum.GetValues(typeof(ExitCodes)))
{
writer.WriteLine(" {0,4:D}: {0:G}", value);
}
D格式说明符将枚举值格式化为十进制。还有一个X说明符,它提供十六进制输出。
G说明符将枚举格式化为字符串。如果Flags属性应用于枚举,则也支持组合值。有一个F说明符,就好像Flags总是存在一样。
参见Enum.Format()。
答案 10 :(得分:2)
在Enum.GetValues结果中,强制转换为int会产生数值。使用ToString()生成友好名称。不需要其他调用Enum.GetName。
public enum MyEnum
{
FirstWord,
SecondWord,
Another = 5
};
// later in some method
StringBuilder sb = new StringBuilder();
foreach (var val in Enum.GetValues(typeof(MyEnum))) {
int numberValue = (int)val;
string friendyName = val.ToString();
sb.Append("Enum number " + numberValue + " has the name " + friendyName + "\n");
}
File.WriteAllText(@"C:\temp\myfile.txt", sb.ToString());
// Produces the output file contents:
/*
Enum number 0 has the name FirstWord
Enum number 1 has the name SecondWord
Enum number 5 has the name Another
*/
答案 11 :(得分:0)
这是一种迭代自定义Enum对象的简单方法
For Each enumValue As Integer In [Enum].GetValues(GetType(MyEnum))
Print([Enum].GetName(GetType(MyEnum), enumValue).ToString)
Next
答案 12 :(得分:0)
一个古老的问题,但3Dave的答案提供了最简单的方法。我需要一些辅助方法来生成Sql脚本,以对数据库中的枚举值进行解码以进行调试。效果很好:
public static string EnumToCheater<T>() {
var sql = "";
foreach (var enumValue in Enum.GetValues(typeof(T)))
sql += $@"when {(int) enumValue} then '{enumValue}' ";
return $@"case ?? {sql}else '??' end,";
}
我以静态方法使用它,所以用法是:
var cheater = MyStaticClass.EnumToCheater<MyEnum>()