2013-01-04 131 views
2

我有一個泛型類型,應該指定Enum類型(實際上,它是幾個指定的枚舉之一,但我會解決System.Enum)。限制泛型類型參數System.Enum

當然編譯器在如下代碼不太願意:

class Generic<T> where T : Enum {} 

「約束不能特殊類的System.Enum'」例外。

唯一的解決辦法,我已經能夠拿出迄今是使用靜態類型初始化檢查的類型參數,並拋出一個異常,如果它不是,事實上,一個枚舉,像這樣:

class Generic<T> 
{ 
    static Generic() 
    { 
    if (typeof(T).BaseType != typeof(Enum)) 
     throw new Exception("Invalid Generic Argument"); 
    } 
} 

它至少爲我提供了運行時安全性,它不會使用非枚舉參數。然而,這感覺有點不好意思,那麼有沒有更好的方法來完成這個,理想情況下使用編譯時構造?

+0

可能重複(http://stackoverflow.com/questions/7244/anyone-know-a-good-workaround-for- enum-generic-constraint) – nawfal

回答

4

不幸的是,沒有辦法確保在編譯時傳遞給泛型類的類型是枚舉。您只能添加以下約束:

class Generic<T> where T : struct { } 

爲了排除所有引用類型,但運行時檢查仍然是必需的。

1

我認爲你可以使用結構:

class Generic<T> where T : Struct 
+0

'struct'允許每個值類型,從int到DateTime到自定義結構。 – SWeko

+1

所有枚舉都是結構,但不是所有結構都是枚舉 – MattDavey

1

枚舉也實現IConvertible接口,這樣你就可以添加,作爲一個約束,與結構一起。

class Generic<T> where T : struct, IConvertible {} 
的[誰知道缺乏一個枚舉泛型約束的一個很好的解決方法嗎?]