2012-01-17 45 views
17

可能重複:
Cast int to Enum in C#是否可以將整數轉換爲枚舉?

我得到了以下枚舉:

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; 

如果不是,我怎麼會用一個整數作爲索引獲取枚舉值,我們使用了很多枚舉,所以我們想要做一些通用的,可重複使用的

+4

如果你打算像這樣使用它,我會顯式地爲你的枚舉值賦值。 – Yuck 2012-01-17 18:10:33

+20

我將開始製作這個我的默認評論:你試過了嗎?如果是這樣,發生了什麼? – 2012-01-17 18:10:51

+2

像這樣的投票問題讓我感到困惑。 – 2012-01-17 18:13:58

回答

41

是的,可以將Enum轉換爲int,反之亦然,因爲每個Enum實際上由默認情況下由int表示。您應該手動指定成員值。 默認情況下,它從0開始。N

也可以將Enum投射到string,反之亦然。

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(); 
} 
+0

假設您尚未將枚舉定義爲'public enum MyEnum:long',在這種情況下,轉換爲int可能會導致截斷。 – 2012-01-17 18:26:08

+0

是的。同uint/ulong。 – ken2k 2012-01-17 18:40:00

+0

由於問題的標題是關於將枚舉強制轉換爲int,並且標記的答案實際上並未包含作爲代碼示例的一部分,我補充說。 – AaronLS 2013-04-16 23:30:50

13

是的,它是可能的。我用下面ENUM

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

然後當我把它稱爲我用這個來獲取值:

(int)AccountTypes.Open 

,它將返回,我需要這對於上述將是2的int值。

+2

OP正試圖走另一條路。他有一個整數值,需要找到相應的枚舉值。 – Yuck 2012-01-17 18:14:59

+0

啊,我現在看到了,謝謝你指出。這仍然可以用於查看提交的值是否等於枚舉的值 – Taryn 2012-01-17 18:18:27

-1

ENUMs只是一種方便的方法來命名整數。 ENUM的值可以被添加,減去並與int相同的方式進行比較。

1
det.documentStatus = (detallistaDocumentStatus)3; 

以上應該可以正常工作。唯一需要記住的是,如果你給枚舉成員分配了特定的數字,那麼類似這樣的事情可能無法按預期工作。此外,如果你沒有明確地編號你的枚舉值,那麼枚舉成員從零開始索引。

因此,上面的代碼將按照聲明的順序分配枚舉的第4個成員。

要檢查一個給定的整數是否是該枚舉使用Enum.IsDefined

1

如果你給一個明確的整數值的枚舉成員,像這樣一個有效的枚舉值:

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

您可以只投他們到一個int獲得隱含的價值。

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

如果沒有明確定義的值至少在第一,它轉換成一整型會給你在它出現在聲明的順序。

10

從C#4.0規格:

1.10枚舉

枚舉值可以被轉換爲整數值,並且反之亦然使用 類型轉換。例如

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

一個額外的一點需要注意的是,你被允許(默認情況下這是INT)在枚舉的基礎類型的範圍內可投的任何整數值,即使該值不映射到枚舉聲明中的一個名稱。從1.10枚舉:

枚舉類型可以採取的值的集合不受其枚舉成員的 限制。特別是,枚舉類型的任何值可以轉換爲枚舉類型,並且是一個明確的有效值 enum類型。

因此,下面還允許在你的榜樣枚舉:

det.documentStatus = (detallistaDocumentStatus) 42; 

即使是具有價值42沒有枚舉名。