只有在运行时才知道值类型时,是否可以将对象[]转换为值类型,如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);
}
真的,为什么不制作一个双数组,并将每个对象的外壳加倍并将其设置到它的索引中呢?简单的循环?可以添加“if(obj is double){...}”来处理不好的对象数组。 – SimpleVar 2012-04-21 02:57:17
resultType不保证是双倍的。它在运行时确定。它可以是任何值类型。 – SFun28 2012-04-21 03:10:21
为什么不使用通用Cast扩展方法?如果你想约束到ValueTypes,你可以创建你自己的Cast方法,该方法使用扩展Cast方法,但在“!typeof(T).IsValueType”时抛出。看看我的答案。 – SimpleVar 2012-04-21 03:36:55