0

列挙型を int として取得したいのですが、初期化子が適用されている場合に限ります。これにより、値が明示的に定義されており、単なるデフォルト値ではないことがわかります。これは、定義された int コードでマッピングを表すために列挙型を使用しているためです。列挙型でこれを行う方法はありますか、それとも辞書のようなものを使用する必要がありますか?

ここに例があります - 私は次のマッピングを持っています:

リンゴ = 1、バナナ = 2、ナシ = 4、パイナップル = 7

列挙型が

public enum Fruit
{
Apples,
Bananas,
Pears,
Pineapples
}

列挙型の 1 の値は、リンゴではなくバナナに対応するため、int 値を取得しようとはしません。もっと明確にする必要がある場合はお知らせください。

アップデート:

null 許容列挙型を使用して、値が設定されている (または不明な要素) かどうかを確認しますが、ここで求めているのはそれではありません。うまく説明できていないので、もう一度やり直します。

何も知らない列挙型を取得し、基になる int を取得して、それを使用して何かを実行できるようにしたいと考えています。私が気にする唯一のことは、実際のコードが定義されていることを示しているため、列挙型が初期化されたことです。ヌルでも構いません。それは私がチェックすることの1つです。しかし、null でない場合は、int コードが明示的に定義されていることを確認したいと思います。コード 0 は、未定義であることを意味する場合でも、元のマッピングで指定されている限り、完全に受け入れられます。

別の更新:

Microsoftのドキュメントからこの「初期化済み」という用語を取得しましたが、混乱を招いていると思います。私が意味したのは、基になる int の値が明示的に定義されている列挙型です。すなわち、

public enum MyEnum
{
One = 1,
Two = 2,
Three = 3
}

そうでないものとは対照的に。すなわち、

public enum MyEnum
{
One,
Two,
Three
}

これらをデフォルト値が設定されていると呼んでいたことも混乱を招いていたと思います。これは、デフォルトで最初の要素が設定されている null 非許容の列挙型と混同しやすいものです。

私がこれを使用している方法は、リフレクションを使用して、特定のカスタム属性を持つプロパティの値を取得するメソッドがあることです。私の目的のために、コードが明示的に定義されている列挙型から値を取得したいだけです。そうでなければ、int 値にビジネス上の意味があるとは思えません。

4

3 に答える 3

0

(null 非許容) 列挙値は、常に有効な整数です。したがって、列挙型のどの定数にも使用されていない値を取得することができます。

Fruit myFruit = (Fruit)12345;    // Some random integer

逆に、値が定数として定義されているかどうかに関係なく、列挙型の整数値をいつでも取得できます。

Fruit myFruit = (Fruit)12345;
int myFruitInt = (int)myFruit;

したがって、列挙型の値が の定義で定義された値の 1 つであることを確認したい場合は、次のようにメソッドenumを使用できます。Enum.IsDefined

Fruit myFruit;
bool isDefined;

myFruit = Fruit.Bananas;
isDefined = Enum.IsDefined(typeof(Fruit), myFruit); // true, Bananas

myFruit = (Fruit)1;
isDefined = Enum.IsDefined(typeof(Fruit), myFruit); // true, Bananas

myFruit = Fruit.Bananas | Fruit.Pineapples;
isDefined = Enum.IsDefined(typeof(Fruit), myFruit); // false

myFruit = (Fruit)12345;
isDefined = Enum.IsDefined(typeof(Fruit), myFruit); // false

もちろん、Typeだけでなく、任意のものをメソッドに入れることができますtypeof(Fruit)


初期化された列挙型について話します。そのようなことはない。列挙型は任意の整数値を持つことができます。値型 (enum を含む) の既定値は 0 です。ただし、値が 0 の enum 定数 (通常はNoneUnknownまたはという名前) が存在する可能性は十分にあります (推奨されることもありますDefault)。したがって、以下は意味的にまったく同じです。

private Fruit myFruit;

private Fruit myFruit = (Fruit)0;

private Fruit myFruit = Fruit.Unknown;

違いがないため、実行時に違いを見分けることはできません。


どうやら状態に関するMSDNのドキュメントenum

デフォルトでは、最初の列挙子の値は 0 で、後続の各列挙子の値は 1 ずつ増加します。たとえば、次の列挙では、Sat は 0、Sun は 1、Mon は 2 などです。

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

次の例に示すように、列挙子は初期化子を使用して既定値をオーバーライドできます。

enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

この列挙では、要素のシーケンスは 0 ではなく 1 から強制的に開始されます。ただし、値が 0 の定数を含めることをお勧めします。

何も初期化されていないため、ドキュメントがこれらの初期化子を呼び出す理由がわかりません。あなたの人生を楽にするための単なる構文です。同等のものを指定することもできます。

enum Days {Sat=1, Sun=2, Mon=3, Tue=4, Wed=5, Thu=6, Fri=7};

おそらく、これは、コンパイラが定数の整数値をそれに続く列挙型定数に割り当てるためにカウントを開始する初期値1であることを意味します。例えば:

enum Days {Sat, Sun=2, Mon, Tue=10, Wed, Thu, Fri=11};

以下と同等です。

enum Days {Sat=0, Sun=2, Mon=3, Tue=10, Wed=11, Thu=12, Fri=11};

繰り返しますが、何も初期化されていません。

于 2013-04-02T21:18:18.490 に答える