2013-08-22 125 views
1

我有一個枚舉型定義,像這樣:轉換的方法參數轉換爲一個枚舉

public enum Status 
{ 
    Active=1, 
    InActive=0 
} 

在我的方法,我可以投的參數爲枚舉這樣的:

public string doSomething(string param1, int status) 
{ 
//will this work?  
Account.Status = (Status) status; 
//or do i need to test one by one like this 
if(status == 0) 
{ 
Account.Status = Status.Inactive; 
//and so on... 
} // end if 
} // end doSomething 
+4

爲什麼不直接運行代碼並找出答案。 – Magnus

+0

@Kaf可能的原因:他使用的數據庫支持'int',但不支持'enum'。 – Nolonar

+0

是的,它會工作。但是,最好檢查int是否在首先聲明的枚舉範圍內。 – VsMaX

回答

1

只需檢查int是否爲Status的有效值,然後執行轉換。

public string doSomething(string param1, int status) 
{ 
    if (IsValidEnum<Status>(status)) 
    { 
     Account.Status = (Status)status; 
    } 
    ... 
} 

private bool IsValidEnum<T>(int value) 
{ 
    var validValues = Enum.GetValues(typeof(T)); 
    var validIntValues = validValues.Cast<int>(); 
    return validIntValues.Any(v => v == value); 
} 

在其他方面,如果你可以拋出異常,如果你願意。

+0

我想這是我尋找的魔法......謝謝 – sirbombay

+0

'Enum.IsDefined'已經做到了 - 看到我的答案。 – James

+0

@詹姆斯,好吧,創建這個方法非常有趣,但是非常規... –

1

是的,你可以從intenum(假設存在該整數的enum表示)進行直接演員表演。

如果您需要檢查enum是否存在解析使用Enum.IsDefined

if (Enum.IsDefined(typeof(Status), status)) 
{ 
    Account.Status = (Status)status; 
} 
+0

內部時,會發生什麼不存在? – sirbombay

+0

被分配的變量返回到「int」 - 兩種類型都是可互換的,所以你不會得到異常。 – James

1

好,當然你可以做到這一點之前。試試看。

你也可以投其他方式

(int)Account.Status 

有可能投枚舉爲int,反之亦然,因爲每個枚舉實際上是由每默認一個int表示。您應該手動指定成員值。默認情況下,它從0開始到N。

如果你試圖轉換一個不存在的枚舉值,它會起作用,但是如果你試圖比較它的任何值枚舉

+0

我真的試過它..它編譯好。但我的擔心是什麼時發生的值傳遞,不存在於枚舉? – sirbombay

+0

@sirbombay你可以嘗試2 :) –

+0

@sirbombay閱讀我編輯的答案 –