web-dev-qa-db-ja.com

整数を列挙型にキャストすることは可能ですか?

私は次の列挙型を取得しました:

 public enum detallistaDocumentStatus {

    /// <remarks/>
    ORIGINAL,

    /// <remarks/>
    COPY,

    /// <remarks/>
    REEMPLAZA,

    /// <remarks/>
    DELETE,
}

次に、タイプdetallistaDocumentStatusのクラスプロパティを取得しました。

 public detallistaDocumentStatus documentStatus {
        get {
            return this.documentStatusField;
        }
        set {
            this.documentStatusField = value;
        }
    }

実際には、ユーザーは宣言された順序で各列挙値を表す番号(1、2、3、または4)を送信します。

だから、このようにキャストすることは可能ですか?

det.documentStatus = (detallistaDocumentStatus)3;

そうでない場合、インデックスとして整数を使用して列挙値を取得するにはどうすればよいですか、多くの列挙を使用しているので、汎用的で再利用可能な何かをしたいです

24
franko_camron

はい、すべてのEnumは実際にはデフォルトでintで表されるため、Enumintにキャストすることができます。メンバー値を手動で指定する必要があります。デフォルトでは、0からNで始まります。

Enumstringにキャストしたり、その逆を行うこともできます。

public enum MyEnum
{
    Value1 = 1,
    Value2 = 2,
    Value3 = 3
}

private static void Main(string[] args)
{
    int enumAsInt = (int)MyEnum.Value2; //enumAsInt == 2

    int myValueToCast = 3;
    string myValueAsString = "Value1";
    MyEnum myValueAsEnum = (MyEnum)myValueToCast;   // Will be Value3

    MyEnum myValueAsEnumFromString;
    if (Enum.TryParse<MyEnum>(myValueAsString, out myValueAsEnumFromString))
    {
        // Put logic here
        // myValueAsEnumFromString will be Value1
    }

    Console.ReadLine();
}
48
ken2k

はい、可能です。次のENUMを使用します

public enum AccountTypes
{
  Proposed = 1,
  Open = 2
}

それから私はそれを呼び出すとき、私はこれを使用して値を取得します:

(int)AccountTypes.Open

そして、それは私が必要とするint値を返します。これは上記のために2になります。

13
Taryn

C#4.0仕様から:

1.10列挙

型キャストを使用して、列挙値を整数値に、またはその逆に変換できます。例えば

int i = (int)Color.Blue;      // int i = 2;
Color c = (Color)2;               // Color c = Color.Blue;

追加の注意事項として、列挙型宣言の名前のいずれかに値がマップされていない場合でも、列挙型の基になる型の範囲(既定ではint)の整数値をキャストできます。 1.10列挙から:

列挙型が取り得る値のセットは、その列挙メンバーによって制限されません。特に、列挙型の基になる型の値は列挙型にキャストでき、その列挙型の明確な有効な値です。

したがって、次の例の列挙型でも許可されます。

det.documentStatus = (detallistaDocumentStatus) 42;

42を持つ列挙名はありませんが。

12
Michael Burr
det.documentStatus = (detallistaDocumentStatus)3;

上記は正常に動作するはずです。ここで覚えておくべきことは、enumメンバーに特定の番号を割り当てている場合、このようなことが期待どおりに機能しない可能性があることです。また、列挙値に明示的に番号を付けていない場合、列挙メンバーはゼロベースのインデックスから始まります。

したがって、上記のコードは、列挙の4番目のメンバーを宣言順に割り当てます。

指定された整数がその列挙に対して有効な列挙値であるかどうかを確認するには、 Enum.IsDefined を使用します

1
IUnknown

次のように、enumメンバーに明示的な整数値を指定した場合:

public enum Foo
{
    Five=5
    , Six
    , Seven
    , Eight
}

それらをintにキャストするだけで、暗黙的な値を取得できます。

var bar = (int)Foo.Six: /// bar == 6

少なくとも最初の値を明示的に定義しない場合、intに値をキャストすると、宣言に表示される順序が与えられます。

1
3Dave