2012-04-21 25 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

相关问题