2010-07-15 33 views
37

我在寫一個實用程序函數,它從數據庫中獲取一個整數,並將一個枚舉的枚舉返回給應用程序。我可以從泛型類型轉換爲C#中的枚舉嗎?

這裏是我試圖做(注意我通過在數據讀取器和列名稱,而不是int在我的真正功能):

public static T GetEnum<T>(int enumAsInt) 
{ 
    Type enumType = typeof(T); 

    Enum value = (Enum)Enum.ToObject(enumType, enumAsInt); 
    if (Enum.IsDefined(enumType, value) == false) 
    { 
     throw new NotSupportedException("Unable to convert value from database to the type: " + enumType.ToString()); 
    } 

    return (T)value; 
} 

但它不會讓我投(T)value說:

無法將類型'System.Enum'轉換爲'T'。

此外,我讀了很多有關使用Enum.IsDefined的混合評論。表現明智,聽起來很差。我還能如何保證有效的價值?

+0

注意,如果情形是換句話說,你必須做'(Enum)v alue'並且你得到'不能將類型'T'轉換爲'System.Enum',你可以只做一個'''''''',就像'Enum'一樣。 – nawfal 2013-06-09 13:07:10

+1

不正確(至少在我的情況下),你會得到舊的'as運算符必須與引用或可爲空的類型('Foo.bar'是不可爲空值的類型)一起使用的錯誤。 – keithl8041 2014-02-10 12:54:54

回答

58

像這樣:

return (T)(object)value; 
+3

最好將'value'聲明爲'object'。 – 2010-07-15 23:13:45

+0

感謝,似乎編譯。我不明白錯誤的原因呢?獎勵積分,如果你可以解釋爲什麼爲了學習:) – Justin 2010-07-15 23:20:57

+2

編譯器沒有意識到'T'是一個枚舉類型。據瞭解,「T」可能是「DateTime」。因此,你不能直接從'object'到'T'以外的任何類型轉換。 – SLaks 2010-07-15 23:23:47

11

更改此:

Enum value = (Enum)Enum.ToObject(enumType, enumAsInt); 

這樣:

T value = (T)Enum.ToObject(enumType, enumAsInt); 

,並刪除投:)

相關問題