gpt4 book ai didi

c# - 如何将 System.Object[*] 转换为 System.Object[] II

转载 作者:行者123 更新时间:2023-11-30 16:12:10 25 4
gpt4 key购买 nike

我遇到了与 Cheva 在他的问题中遇到的类似问题:

How to cast System.Object[*] to System.Object[]

我通过 COM 互操作功能使用外部库 (Reuters EIKON API)。

提交请求后,对象得到更新,其数据成员也得到更新。对象目录为数据成员显示了这一点:

public virtual dynamic Data { get; }

在 Debug模式下,我可以看到,提交请求后,DataStatus 变为 dataset_full 并且 Data 成员实际上已填充。

数据成员显示为{object[1..31]},我可以从调试下拉菜单中看到,这个集合中实际上有一个字符串。

我的问题是我无法访问这个对象。我可以将它转换为 object[]string[] 或任何东西。我什至无法找出它的类型。

它总是说 System.Object[*] 不能转换为 System.Object[]

如果我尝试使用 .Type() 找出类型,我会得到“System.Reflection.TargetInvocationException”。我什至无法访问它的长度,这也给了我错误

System.InvalidCastException -> Object of Type "System.Object[*]" cannot be cast to type "System.Object[]"

有没有人见过类似的错误?

最佳答案

System.Object[*]System.Array它是一维的但没有索引,从 0 开始.它在 C# 中没有得到很好的支持,因为 C# 使用基于 0 的索引。

A System.Object[*]不是 object[] ,因此您不能转换为该类型。

您可以使用:

var dataAsArray = (Array)Data;

var dataAsNonGenericIList = (IList)Data;

然后你可以 foreach 通过它。

或者您可以通过索引访问单个条目,如下所示:

object first = dataAsArray.GetValue(1);

分别是:

object first = dataAsNonGenericIList[1];

您需要计算上下限( dataAsArray.GetLowerBound(0) , dataAsArray.GetUpperBound(0) ),但下限似乎是 1在你的情况下。

您可以转换为 string按照通常的方式,(string)first如果你希望它每次都是一个字符串,或者类似 first as string 的东西(然后检查是否为空)如果你想支持其他对象。


相反,如果您想将“怪异”数组复制到一个索引为 0 的数组,请参阅没有数字 II 的链接线程在标题中。当然,索引会发生变化。例如object[] newArray = new object[dataAsArray.Length]; dataAsArray.CopyTo(newArray, 0);


很多以后编辑:

除了我上面写的以外,与 C# 一起使用的运行时绑定(bind)程序中还有一个错误 dynamic实际类型为 System.Object[*] 时的功能.这也可以从上面的问题中推断出来。举个例子(我创建的数组的秩为 1,唯一维度的长度是 31,并且该维度的下界是 1(即非零索引)):

dynamic Data = Array.CreateInstance(typeof(object), new[] { 31, }, new[] { 1, });
dynamic t = Data.GetType(); // throws!
dynamic s = Data.ToString(); // throws!

在任何一种情况下都是 InvalidCastException被抛出:

Unable to cast object of type 'System.Object[*]' to type 'System.Object[]'.

我会说这是一个错误。成员存在,我没有要求转换为该类型,我要求对存在的成员进行后期绑定(bind)。

当我直接从 dynamic 转换时,在运行时出现了完全相同的错误至 ArrayIList ,正如我在上面的原始答案中所做的那样。

您可以通过以下方式解决此错误:

var dataAsArray = (Array)(object)Data;

和:

var dataAsNonGenericIList = (IList)(object)Data;

转换为 object后期绑定(bind)(即来自 dynamic )似乎不受该错误的影响。下一个 Actor ,来自objectArray (或到 IList ),是没有 dynamic 的正常向下转换魔法,这当然有效。

有了这个,我的回答变得有用(多年后)。

我刚刚意识到 an answer by RoadBump in a linked thread也提供了这些信息,所以请投票给那个答案。

关于c# - 如何将 System.Object[*] 转换为 System.Object[] II,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23366984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com