【问题标题】:How do I iterate through a Dynamic type array [duplicate]如何遍历动态类型数组 [重复]
【发布时间】:2014-06-19 15:59:24
【问题描述】:

我有一个 COM 读取我们的 VMS 系统并返回一个动态类型的数组。

在 Visual Studio 中,当我检查它显示的类型时:

dynamic {object[]}

所以我尝试了以下方法:

var lines = myApp.GetScreenLines();
foreach(var line in lines)
{
  //Do something
}

但我不断收到异常:

无法将“System.Object[*]”类型的对象转换为“System.Object[]”类型。

但是,如果我检查 lines,它会像普通数组一样显示,我什至可以展开它来查看数据。

有谁知道如何将这种动态数组数据类型转换为字符串类型?

我已经尝试了重复链接中的解决方案,但它们似乎不起作用,因为他们认为我知道有关数组的信息。但由于它是动态的,直到运行时我才知道任何事情,所以我无法获得数组的下限或上限。

PS 我无法控制myApp.GetScreenLines();作为 COM API 返回。

编辑:

副本中提供的解决方案无法解决我的问题。我都试过了。

我尝试的第一个是:

    Array sourceArray = myWinFormsApp.GetScreenLines();
    if (sourceArray.Rank != 1)
    throw new InvalidOperationException("Expected a single-rank array.");

    object[] newArray2 = new object[sourceArray.Length];
    Array.Copy(sourceArray, sourceArray.GetLowerBound(0),
                       newArray2, 0, sourceArray.Length);

这会导致异常:无法将“System.Object[*]”类型的对象转换为“System.Object[]”类型。

我尝试的第二个是:

object[] newArray = myWinFormsApp.GetScreenLines().Cast<object>().ToArray();

我得到了例外:“System.Array”不包含“Cast”的定义

所以我不认为这个问题是重复的,正如我解释的那样,我可以使用 Visual Studio 中的“watch”工具查看数组,但我似乎无法遍历它

【问题讨论】:

  • 您是否尝试过使用foreach(dynamic line in lines)
  • “重复”中的任何解决方案也都不起作用。从 COM 返回的是我无法控制的动态值。
  • 我遇到了与 OP 相同的问题,即链接的“答案”中的解决方案不适用于动态。但是在链接的答案中找到 RoadBump 的帖子 - 这对我很有用。您必须通过对象将其双重转换为数组。然后很容易迭代。

标签: c# arrays type-conversion


【解决方案1】:

尝试使用 dynamic 而不是 var

var lines = myApp.GetScreenLines();
foreach(dynamic  line in lines)
{
  //Do something
}

【讨论】:

  • 我试过我得到了这个异常:无法将'System.Object[*]'类型的对象转换为'System.Object[]'类型。
猜你喜欢
  • 2013-06-13
  • 2018-06-04
  • 2023-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多