我想创建一个动态GUI,将Enum的所有选项作为按钮列出。我需要一种方法来传递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;
}
我想做的是可能的吗?我已经尝试了几个完整的重写基于这个问题的信息使用c#枚举的sental值(在编译时枚举的大小)?但是我不能让它工作
string[] names = Enum.GetNames(typeof(Fruits));
你可以用
public static IEnumerable<string> EnumToStringArray(Type enumeratedType) {
if (!enumeratedType.IsEnum)
throw new ArgumentException("Must be an Enum", "enumeratedType");
return Enum.GetNames(enumeratedType);
}
,但这是不必要的,因为如果给定的类型不是Enum
, Enum.GetNames(...)
本身会抛出一个ArgumentException
。(感谢@Alexander Balte)。所以你不需要一个自己的函数。就像其他人已经提到的那样,Enum.GetNames(typeof(Fruits))
可以简单地完成这项工作。
您似乎误解了sizeof
关键字的含义。它返回值类型与非托管内存中的其他值排列时"占用"的字节数(每个字节等于8位)。
unsafe
上下文(如指针), sizeof
是没有用的。
对于您的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
,因此,如果枚举有这样的重复项,请不要使用这种方法。