我想创建一个动态GUI,将所有Enum的选项列为按钮。所以,我需要一种方法将Enum类型传递给一个方法,然后返回一个包含枚举类型的所有选项的字符串数组。
例如,给定文件Foo.cs中的Enum声明:
public Enum Fruits {
Apple,
Orange,
Peach
};
public class Foo { ... }
我希望退回:
{ "Apple", "Orange", "Peach" }
我经历了几种代码排列。现在我有以下但是我收到错误“类型或命名空间名称'enumeratedType'找不到”
public static string[] EnumToStringArray (System.Type enumeratedType) {
int enumSize = sizeof(enumeratedType);
string[] enumStrings = new string[enumSize];
for (int i = 0 ; i < enumSize ; i++) {
enumStrings[i] = enumeratedType.getValues()[i].toString();
}
return enumStrings;
}
我想做的是什么?我根据这个问题Using sentinal values in C# enum (size of enum at compile time)?中的信息尝试了几次完整的重写,但我无法让它工作。
答案 0 :(得分:7)
string[] names = Enum.GetNames(typeof(Fruits));
答案 1 :(得分:0)
您可以使用类似
的内容public static IEnumerable<string> EnumToStringArray(Type enumeratedType) {
if (!enumeratedType.IsEnum)
throw new ArgumentException("Must be an Enum", "enumeratedType");
return Enum.GetNames(enumeratedType);
}
但即使这样也是不必要的,因为如果给定的类型不是Enum.GetNames(...)
,ArgumentException
本身会抛出Enum
。 (谢谢@Alexander Balte)。
所以你无论如何都不需要自己的功能。正如其他人已经提到的那样,Enum.GetNames(typeof(Fruits))
完成了这项工作。
答案 2 :(得分:0)
您似乎误解了sizeof
keyword的含义。当它与非托管内存中的其他值对齐时,它返回值类型“占用”的字节数(每个字节等于8位)。
sizeof
上下文(如指针),则 unsafe
无效。
对于Fruits
类型,sizeof(Fruits)
返回4
,因为基础迭代类型是Int32
(因为这是默认情况下,否则您没有指定)。 Int32
需要32位,因此sizeof
返回4
。如果您有1种,2种,10种或4294967296种不同的水果,则无关紧要。
请注意,枚举可以有多个指向相同值的名称,例如:
public enum Fruits {
Apple,
Orange,
Peach,
ChineseApple = Orange,
}
在这个例子中,枚举包含四个命名常量,但其中两个“映射”到相同的值。在这种情况下,Enum.GetNames(typeof(Fruits))
将为您提供所有四个名称。
但是Enum.GetValues(typeof(Fruit))
会为您提供Fruit
的四个值的列表,其中两个是相同的。您无法事先知道这两个相同的值是显示为Orange
还是ChineseApple
,因此如果您的枚举有类似的重复,请不要使用此方法。