0

我想创建一个动态 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;
}

我正在尝试做的事情可能吗?我已经根据这个问题中的信息尝试了几次完整的重写Using sentinal values in C# enum (size of enum at compile time)? 但我无法让它工作。

4

3 回答 3

7
string[] names = Enum.GetNames(typeof(Fruits));
于 2013-01-10T22:02:15.747 回答
0

你可以使用类似的东西

public static IEnumerable<string> EnumToStringArray(Type enumeratedType) {
    if (!enumeratedType.IsEnum)
        throw new ArgumentException("Must be an Enum", "enumeratedType");

    return Enum.GetNames(enumeratedType);
}

但即使这样也是不必要的,因为如果给定的类型是 no ,Enum.GetNames(...)它本身就会抛出一个。(感谢@Alexander Balte)。因此,无论如何您都不需要自己的功能。正如其他人已经提到的那样,只需完成这项工作。ArgumentExceptionEnumEnum.GetNames(typeof(Fruits))

于 2013-01-10T22:09:52.993 回答
0

您似乎误解了sizeof关键字的含义。它返回值类型在与非托管内存中的其他值对齐时“占用”的字节数(每个字节等于 8 位)。

sizeof如果您不使用unsafe上下文(如指针),则没有用。

对于您的Fruits类型,sizeof(Fruits)返回,4因为基础迭代器类型是 an Int32(因为这是您未另行指定时的默认值)。AnInt32需要 32 位,因此sizeof返回4. 如果您有 1、2、10 或 4294967296 种不同的水果,则无关紧要。

请注意,一个枚举可以有多个名称指向同一个值,例如:

public enum Fruits {
  Apple,
  Orange,
  Peach,
  ChineseApple = Orange,
}

在此示例中,枚举包含四个命名常量,但其中两个“映射到”相同的值。在这种情况下,Enum.GetNames(typeof(Fruits)), 会给你所有四个名字。

但是Enum.GetValues(typeof(Fruit))会给你一个 的四个的列表Fruit,其中两个是相同的。您无法提前知道这两个相同的值是否会显示为Orangeor ChineseApple,因此如果您的枚举有这样的重复项,请不要使用此方法。

于 2013-01-10T22:39:04.330 回答