2012-04-21 24 views
2

只有在運行時才知道值類型時,是否可以將對象[]轉換爲值類型,如double []?如果object []中的對象無法使用.net內置轉換轉換爲值元素類型(例如double),則異常是完全可以接受的。嘗試在運行時將對象[]轉換爲ValueType []

var original = new object[] { 1 , 2 , 3 , 4 , 5 , 6 } 
Type resultType = typeof(double[]); // or any means of getting a type at runtime 
var result = ?? 

下面的嘗試都失敗了:

# error: Object must impliment IConvertible 
Convert.ChangeType(original , resultType); 

# error: Object cannot be stored in an array of this type. 
var result = Array.CreateInstance(resultType , original.Length); 
for (int i = 0 ; i < original.Length ; i++) 
{ 
    result.SetValue(Convert.ChangeType(original[ i ] , resultType.GetElementType()) , i); 
} 
+0

真的,爲什麼不製作一個雙數組,並將每個對象的外殼加倍並將其設置到它的索引中呢?簡單的循環?可以添加「if(obj is double){...}」來處理不好的對象數組。 – SimpleVar 2012-04-21 02:57:17

+0

resultType不保證是雙倍的。它在運行時確定。它可以是任何值類型。 – SFun28 2012-04-21 03:10:21

+0

爲什麼不使用通用Cast擴展方法?如果你想約束到ValueTypes,你可以創建你自己的Cast方法,該方法使用擴展Cast方法,但在「!typeof(T).IsValueType」時拋出。看看我的答案。 – SimpleVar 2012-04-21 03:36:55

回答

3

你的最後一次嘗試是非常接近:第一行應該是

var result = Array.CreateInstance(resultType.GetElementType(), original.Length); 

因爲Array.CreateInstance需要元素類型作爲第一個參數。除此之外,它應該完美地工作。

+0

當然!在星期五晚上編碼==不好。 =) – SFun28 2012-04-21 01:46:50

0
private T[] Cast<T>(params object[] items) 
{ 
    if (!typeof(T).IsValueType) 
    { 
     throw new ArgumentException("Destined type must be Value Type"); 
    } 

    return items.Cast<T>().ToArray(); 
} 
+0

upvoted取消downvote。儘管OP並不十分清楚,但他在代碼註釋中表示,類型對象在運行時只可用。 – nawfal 2014-01-17 14:35:12

相關問題