2011-10-31 65 views
2

有沒有辦法創建一個方法來獲取一個枚舉類型作爲參數,並從它的值返回枚舉底層類型的通用列表,無論底層類型是int \短字節等'...
我看到了Jon Skeet的this answer,但它看起來太複雜了。C#:枚舉值的通用列表

+0

示例輸入和輸出?即你想要輸入「SomeEnum」,還是「byte」等? –

+0

@MarcGravell正如我寫的,我希望泛型類型是底層類型 - 字節。 – gdoron

回答

5

如果你想在一個Type通過,它不能真正有效地通用的 - 你必須返回一個類型不直接與輸入,因此這樣的:

public static Array GetUnderlyingEnumValues(Type type) 
    { 
     Array values = Enum.GetValues(type); 
     Type underlyingType = Enum.GetUnderlyingType(type); 
     Array arr = Array.CreateInstance(underlyingType, values.Length); 
     for (int i = 0; i < values.Length; i++) 
     { 
      arr.SetValue(values.GetValue(i), i); 
     } 
     return arr; 
    } 

這是下一個強類型的載體,所以你可以強制轉換成int[]

+0

你可以設置方法來獲取Enum類型作爲一個泛型參數,但它不會改變一個東西,對吧? – gdoron

+0

@gdoron確實有它''不會幫助我們,因爲我們不是返回'TEnumType []',而是'int []','byte []'等等 - 我們不能通過仿製藥告訴。 –

2

雖然馬克的回答是沒有錯的有點不必要。 Enum.GetValues(type)返回一個TEnum[],所以這種方法是不必要的,因爲如果您知道底層類型,您可以將其TEnum[]投射到其基礎類型數組。

var underlyingArray = (int[])Enum.GetValues(typeof(StringComparison)); 

是有效的C#,將編譯並在運行時不會拋出異常。既然你需要一個列表,你可以將它傳遞給List<Tunderlying>構造函數,或者你可以調用ToArray()擴展方法。

編輯:你可以寫的功能,例如::

public static TUnderlying[] GetValuesAs<TUnderlying>(type enumType) 
{ 
    return Enum.GetValues(enumType) as TUnderlying[]; 
} 

但你必須先知道的基本類型。

+0

謝謝!但是你仍然不能返回強類型列表的一個函數,對吧? – gdoron

+0

這是正確的枚舉不是傳統方式的泛型類型,如果枚舉類似於'MyEnum:Enum '那麼泛型'那麼這將是可能的。 –