【问题标题】:C# converting an array returned as a generic object to a different underlying typeC# 将作为泛型对象返回的数组转换为不同的底层类型
【发布时间】:2017-07-16 07:00:01
【问题描述】:

我有一个 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 变量的中间转换,但无济于事。

有没有办法以简单的方式执行这种类型转换?

【问题讨论】:

  • 所有提供的答案都可以正常工作;接受@AlexWiese 版本作为正确答案,因为他在 AnyName 之前提供了这样的解决方案。谢谢大家!

标签: c# arrays object dynamic type-conversion


【解决方案1】:

如果在编译时不知道数组元素的类型:

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

【讨论】:

  • 是的,不幸的是库方法返回object而不是object[],所以Select不适用。
  • @Nkosi 我没有注意到。我刚刚更新了我的答案。
  • @AnyName,不错的方法,但您实际上在编译时转换为int,而我只能在运行时使用GetType() 读取底层类型。也许我的示例不是 100% 清楚,我会尝试对其进行编辑以使其更清晰
【解决方案2】:

你可以创建扩展方法..

        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();

【讨论】:

    【解决方案3】:

    如果你在编译时不知道类型,你可以尝试转换它。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多