我有一个C#方法,它使用object
作为通用容器来返回可以使用不同数据类型声明的数据数组。下面是这种方法的简化示例:
void GetChannelData(string name, out object data)
{
// Depending on "name", the underlying type of
// "data" can be different: int[], byte[], float[]...
// Below I simply return int[] for the sake of example
int[] intArray = { 0, 1, 2, 3, 4, 5 };
data = intArray;
}
我需要将所有返回的数组元素转换为double
,但到目前为止我找不到方法。理想情况下,我想执行类似的事情:
object objArray;
GetChannelData("test", out objArray);
double[] doubleArray = Array.ConvertAll<objArray.GetType().GetElementType(), double>(objArray, item => (double)item);
由于ConvertAll
不接受在运行时定义的类型,因此失败了。我也试过中间转换到dynamic
变量,但无济于事。
有没有办法以简单的方式执行这种类型转换?
答案 0 :(得分:4)
如果您在编译时不知道类型,可以尝试转换它。
var array = (IEnumerable)objArray;
var doubles = array.OfType<object>().Select(a => Convert.ToDouble(a)).ToArray();
答案 1 :(得分:3)
如果您在编译时不知道数组元素的类型:
var doubleArray = (objArray as Array).OfType<object>()
.Select(m => Convert.ToDouble(m)).ToArray();
答案 2 :(得分:1)
你可以创建扩展方法..
public static IEnumerable<T> Convert<T>(this IEnumerable source)
{
foreach (var item in source)
yield return (T)System.Convert.ChangeType(item, typeof(T));
}
使用..
object objArray;
GetChannelData("test", out objArray);
var array = (IEnumerable)objArray;
var doubleArray = array.Convert<double>().ToArray();