我有一個對象數組(object[]
)。該數組中的所有項目都具有相同的類型(編譯時未知)。我需要在一個類型數組中轉換這個數組,也就是說,如果這些項是整數,我想得到一個int[]
。自動拆箱
我已經看過Array.ConvertAll
方法,但我需要在模板中指定一個特定的類型,這意味着我必須獲取元素類型,然後調用ConvertAll
爲每個可能的情況。
我也看過關鍵字dynamic
沒有更多的運氣(看起來像dynamic[]
是object[]
相同)。
我該如何做到這一點?
我有一個對象數組(object[]
)。該數組中的所有項目都具有相同的類型(編譯時未知)。我需要在一個類型數組中轉換這個數組,也就是說,如果這些項是整數,我想得到一個int[]
。自動拆箱
我已經看過Array.ConvertAll
方法,但我需要在模板中指定一個特定的類型,這意味着我必須獲取元素類型,然後調用ConvertAll
爲每個可能的情況。
我也看過關鍵字dynamic
沒有更多的運氣(看起來像dynamic[]
是object[]
相同)。
我該如何做到這一點?
喬恩的解決方案,你可以在不動做,使用數組類型的相似:
public Array Convert(Array a) {
if (a.GetLength(0) == 0){
return new int[0];
}
var type = a.GetValue(0).GetType();
var result = Array.CreateInstance(type, a.GetLength(0));
for (int i = 0; i < a.GetLength(0); i++) {
result.SetValue(a.GetValue(i), i);
}
return result;
}
不錯 - 這是比我的更好的解決方案,雖然我可能使用'object []'作爲輸入,所以你可以使用'0'和'a.Length'來代替所有的下限/上限。 –
@JonSkeet謝謝 - 我沒有意識到,實際上今天你不能創建一個0以外的下界的數組 - 他們在VB 2003中明顯改變了它。我會更新片段。 – Sebastian
這聽起來像你想要的東西,如:
dynamic array = Array.CreateInstance(input[0].GetType(), input.Length);
for (int i = 0; i < input.Length; i++)
{
array[i] = (dynamic) input[i];
}
這裏dynamic
只是處理轉換部分爲您服務。
或者:
public static Array ConvertArray(object[] input)
{
dynamic sample = input[0]; // Just used for type inference
return ConvertArrayImpl(sample, input);
}
private static T[] ConvertArrayImpl<T>(T sample, object[] input)
{
return input.Cast<T>().ToArray();
}
你能做到讓ConvertArrayImpl
電話與反思手動的過程,而不是使用動態類型。
還要注意的是,如果輸入數組爲空,所有的這些都將失敗......
你的第一個版本不起作用,它拋出'RuntimeBinderException'消息「無法隱式轉換類型'對象'爲'int'。」。將循環體更改爲'array [i] =(dynamic)input [i];'修復了這個問題。 – svick
@svick:良好的發現 - 修好了,謝謝。 –
爲什麼你想這樣做?你打算如何使用結果數組?它是否真的必須是運行時類型('Type'對象),還是泛型('T'類型參數)也可以嗎? – svick
有趣的是 - 在運行時將'object []'轉換爲'int []'後,你將在運行時使用你的集合做什麼?在編譯時,你將無法使用你的項目作爲int# –
我正在使用像'theMethod(object array)'方法的庫,其中數組必須是給定類型的數組(返回錯誤在'object []'的情況下)。 – gregseth