【问题标题】:Convert dynamic System.String[*] to System.String[] type in .net C# [duplicate]在.net C#中将动态System.String [*]转换为System.String []类型[重复]
【发布时间】:2016-03-08 11:14:46
【问题描述】:

我有一个 c# 项目,其中的数据类型我不知道。

如图所示,数据类型来自一个没有方法或属性的类,但是当我将鼠标悬停在它上面时,它会显示项目。

另外,当我尝试使用 foreach 命令时出现错误。

此外,它不能转换为 List、Dictionary 或 Stringp[]。 请指导我工作。谢谢

 private void button2_Click(object sender, EventArgs e)
    {
        var a1 = new OPCServer();

        var anOPCDAServers=new OPCServer();
        var serverName="FARATARH-PC";
        var AllOPCDAServers = new List<string>();
        var asw = anOPCDAServers.GetOPCServers("FARATARH-PC");
        //Console.WriteLine(typeof(asw).ToString);

        foreach (var item in asw)
        {
            //AllOPCDAServers.Add(item);
        }


        //var nod = AllOPCDAServers[4];


        //a1.Connect(serverName, );




    }

screenshot

【问题讨论】:

  • 欢迎来到 Stack Overflow。请在您的问题中添加代码as text,以及错误消息as text。屏幕截图对于附加信息可能很有用,但代码应始终以文本形式显示,以及上下文描述(在这种情况下,您正在与 COM 对象交谈......)
  • if (asw is System.Collections.IEnumerable) 放在foreach 之前,检查是否可以枚举
  • 是的,令人惊讶!
  • 这不是一个重复的问题。如果是这样,建议的答案对我有用。那个人一直在使用不同的 dll。

标签: c# .net type-conversion


【解决方案1】:

asw 是一个动态对象数组。不要使用 var 类型循环,而是使用 dynamic 作为类型。

foreach (dynamic item in aswItems)
{
   // code here
}

【讨论】:

  • 再次出现未处理错误,无法将 System.String[*] 转换为 System.String[]
  • 您能否发布完整的错误信息。还要发布您的代码而不是屏幕截图。
【解决方案2】:

理论上,你可以这样做

string[] foo = asw;

并使用它。

【讨论】:

  • 它不起作用。它给出了未经处理的错误。它是:无法将 System.String[*] 转换为 System.String[]
【解决方案3】:

尝试使用 AsEnumerable() 来枚举数组。

foreach(var item in asw.AsEnumerable())
{
}

【讨论】:

  • AsEnumerable() 没有为 system.array 定义。它有类型:System.string[*}
【解决方案4】:

String[*] 表示一个可以有一个非零下界的数组。它们与常规 string[] 不兼容,但您仍然可以将其转换为 System.Array 并以这种方式使用它。所以试试

IEnumerable<string> oOPCList;

oOpcServer = new RsiOPCAuto.OPCServer();
oOPCList = ((Array)(object)oOpcServer.GetOPCServers()).Cast<string>();
foreach(var item in oOPCList)
    ...

需要先到object,然后到Array,然后通过Cast&lt;string&gt;IEnumerable&lt;string&gt;,因为以下原因:

GetOPCServers 返回一个dynamic 类型。尝试以任何方式访问该动态实例 - 甚至通过调用 GetType 都会触发 InvalidCastException。因此,首先需要将其转换为object,使其不再是动态类型。之后,我们可以将其转换为 Array,这是 C# 中唯一支持的处理非从零开始的数组的方式。但是Array 不是强类型,所以我们将调用附加到Cast&lt;string&gt; 以获得强类型枚举。

source

【讨论】:

  • 好主意,但仍然无法正常工作。再次出现同样的未处理错误。
  • @Amir_Controller 什么错误?你能用代码和完整的错误信息更新你的问题吗?
  • 好的,只要你把它作为dynamic我更新了答案。
  • 向前迈出了一大步。转换为 Object 会保留项目,但转换为数组会给出一个空数组。太棒了!
猜你喜欢
  • 2019-12-07
  • 2012-09-07
  • 1970-01-01
  • 2014-03-14
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 2012-05-24
  • 2014-09-14
相关资源
最近更新 更多