0

Enum のすべてのオプションをボタンとして一覧表示する動的 GUI を作成したいと考えています。したがって、列挙型をメソッドに渡し、列挙型が取り得るすべてのオプションの文字列配列を取得する方法が必要です。

たとえば、ファイル 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# enum (コンパイル時の列挙型のサイズ) でセンティナル値を使用しますか? しかし、私はそれを機能させることができませんでした。

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 ビットに等しい) を返します。

sizeofunsafeコンテキスト (ポインターなど)を使用しない場合は役に立ちません。

Fruitsタイプの場合、基になる iterer タイプが an であるため (特に指定しない場合はそれがデフォルトであるため) をsizeof(Fruits)返します。Anは 32 ビットを必要とするため、 を返します。1 つ、2 つ、10 つ、または 4294967296 個の異なる果物があるかどうかは問題ではありません。4Int32Int32sizeof4

列挙型は、次のように同じ値を指す複数の名前を持つことができることに注意してください。

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

この例では、列挙型に 4 つの名前付き定数が含まれていますが、そのうちの 2 つは同じ値に "マップ" されています。その場合、Enum.GetNames(typeof(Fruits))は 4 つの名前すべてを与えます。

しかし、 の 4 つのEnum.GetValues(typeof(Fruit))リストが表示され、そのうちの 2 つが同一です。2 つの同一の値がまたはとして表示されるかどうかを事前に知ることはできないため、列挙型にそのような重複がある場合は、このアプローチを使用しないでください。FruitOrangeChineseApple

于 2013-01-10T22:39:04.330 に答える