简体   繁体   English

C#将作为通用对象返回的数组转换为不同的基础类型

[英]C# converting an array returned as a generic object to a different underlying type

I have a C# method which uses object as a generic container to return a data array which could be declared using different data types. 我有一个C#方法,它使用object作为通用容器来返回一个可以使用不同数据类型声明的数据数组。 Below a simplified example of such a method: 下面是这种方法的简化示例:

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;
}

I need to convert all the returned array elements to double but so far I could not find a way. 我需要将所有返回的数组元素转换为double但到目前为止我找不到方法。 Ideally I would like to perform something like: 理想情况下,我想执行以下操作:

object objArray;
GetChannelData("test", out objArray);
double[] doubleArray = Array.ConvertAll<objArray.GetType().GetElementType(), double>(objArray, item => (double)item);

Which miserably fails because ConvertAll does not accept types defined at runtime. 由于ConvertAll不接受在运行时定义的类型,因此失败了。 I have also tried intermediate conversions to a dynamic variable, to no avail. 我也尝试过中间转换为dynamic变量,但无济于事。

Is there any way to perform such type conversion in a simple manner? 有没有办法以简单的方式执行这种类型转换?

If you don't know the type at compile time you can try to convert it. 如果您在编译时不知道类型,可以尝试转换它。

var array = (IEnumerable)objArray;
var doubles = array.OfType<object>().Select(a => Convert.ToDouble(a)).ToArray();

If you don't know the type of array elements at compile-time: 如果在编译时不知道数组元素的类型:

var doubleArray = (objArray as Array).OfType<object>()
    .Select(m => Convert.ToDouble(m)).ToArray();

u can create extension method.. 你可以创建扩展方法..

        public static IEnumerable<T> Convert<T>(this IEnumerable source)
        {
           foreach (var item in source)
               yield return (T)System.Convert.ChangeType(item, typeof(T));
        }

using .. 用...

        object objArray;
        GetChannelData("test", out objArray);
        var array = (IEnumerable)objArray;
        var doubleArray = array.Convert<double>().ToArray();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM