如何返回包含Enum值的字符串[]

时间:2013-01-10 22:00:10

标签: c# arrays string enums namespaces

我想创建一个动态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)?中的信息尝试了几次完整的重写,但我无法让它工作。

3 个答案:

答案 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,因此如果您的枚举有类似的重复,请不要使用此方法。