如何返回一个包含枚举值的字符串[]

本文关键字:枚举 字符串 包含 何返回 返回 一个 | 更新日期: 2023-09-27 17:51:20

我想创建一个动态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的四个值的列表,其中两个是相同的。您无法提前知道两个相同的值是否将显示为OrangeChineseApple,因此,如果枚举有这样的重复项,请不要使用这种方法。