2014-06-25 52 views
4

我怎樣才能從包含一個枚舉類型的數組的對象類型變量轉換爲枚舉[]?換句話說:給定一個對象,這是一個枚舉值的數組,我怎麼能不知道枚舉類型得到一個枚舉[]

// Somewhere in the code we have: public enum MyEnum {This,That}; 
// Somewhere else in the code we have: public enum TheirEnum {What,Ever}; 
// In other parts of the code we have additional enum types 

// Now, given: 
object enumArrayOfSomeType=...; // Maybe it's of type MyEnum[] or TheirEnum[] or 
           // SomeOtherEnum[] 

// I want to say 
Enum[] someEnumArray=enumArrayOfSomeType as Enum[]; 

不幸的是,所呈現的代碼總是在某些EnumArray中導致null值。

有沒有辦法做到這一點?

更新

我猜我期待陣列協方差踢,但也許我的期望太高了(即數組協變狂野)。

此外,由於克里斯辛克萊在評論中指出接受的答案,即數組協方差適用於只有引用類型,其中最引用的類型肯定不是。 (見:.NET Array Covariance rules in MSDN。)

+1

所以,你真的想在最後輸入「Enum」,或者你想嘗試弄清楚枚舉類型是什麼? – Chris

+0

因爲我正在編寫一個函數,它可以從枚舉值中獲取屬性,而不管枚舉的類型(即一個非常通用的函數),我真的希望將某些東西的類型設置爲'Enum []'。 –

回答

6

我懷疑你必須創建一個新的數組並且投射每個元素,只是因爲MyEnum[]不是Enum[]。一個簡單的LINQ查詢可以做到這一點:

Enum[] someEnumArray = ((IEnumerable)enumArrayOfSomeType).Cast<Enum>().ToArray(); 

編輯:根據您的意見,如果你只是想一次迭代,並避免創建一個數組,你可以溝ToArray()呼叫並把它當作遞延IEnumerable<Enum>

IEnumerable<Enum> someEnumArray = ((IEnumerable)enumArrayOfSomeType).Cast<Enum>(); 

所以它基本上只是迭代元素並且一次投射一個元素。

EDITx2:從編輯的問題,爲什麼陣列協方差沒有踢,這是因爲它只適用於參考類型哪些枚舉不是。從MSDN 12.5 Array covariance

對於任何兩個引用類型 A和B,如果隱式引用 轉換(第6.1.4節)或顯式引用轉換(第6.2.3 )從A到B存在,那麼相同的參考轉換也存在陣列類型A [R]到陣列類型B [R]

+0

剛剛說過這樣的話,但是我把'object'變成'IEnumerable'的時候有點慢。 – Chris

+0

謝謝,這當然會起作用,但是會以創建新陣列爲代價。 –

+0

@MichaelGoldshteyn:如果你想避免創建數組,你可以拋棄'ToArray()'調用並將其視爲'IEnumerable '。看我的編輯。 –

相關問題