当前位置:  开发笔记 > 编程语言 > 正文

将对象数组复制到不同类型的数组

如何解决《将对象数组复制到不同类型的数组》经验,为你挑选了1个好方法。

以前,我遇到了一个问题,试图在我的ASMX webservice和我的.aspx页面之间共享一个类型定义(webclient)

困惑于C#对象数组和隐式类型转换

据我所知,这个建议的"问题"可以通过将客户端中创建的对象数组复制到ASMX代理类定义的新对象数组来解决.

作为C#的新秀,我仍在努力完成这项简单的任务.以下是我的代码的更多部分(上一篇文章中的其他片段保持不变):

...这里是我填充"测试数据"的地方,我想传递给Web服务:

// create an array of MetaData objects
MetaData[] nvPairs = new MetaData[20];   // arbitrary length of 20 pairs

// create arbitrary MetaData objects in the array
nvPairs[0] = new MetaData("Grant Number", "2577-9912");
nvPairs[1] = new MetaData("OPEAnalyst", "Simpson");

...这里我尝试一个函数从我的TRIMBrokerUtil命名空间中定义的"真实"类型(由于代理我不能完全使用)"复制"到该类型的代理版本:

protected TRIMBrokerASMXProxy.ASMXProxy.MetaData[] CopyMetaData(
    MetaData utilArray)
{
    TRIMBrokerASMXProxy.ASMXProxy.MetaData[] outArray = 
        new TRIMBrokerASMXProxy.ASMXProxy.MetaData[utilArray.Name.Length];
    int i;
    for (i = 0; i < utilArray.Name.Length; i++)
    {
        outArray[i].Name = utilArray.Name;
        outArray[i].Value = utilArray.Value;
    }
    return outArray;
}

...然后在这里我尝试调用该函数(编译器在此行标记2个错误:

TRIMBrokerASMXProxy.ASMXProxy.MetaData[] kvData = 
    CopyMetaData(metaDataArray); 

下面的两个编译错误都指向同一行:

错误1'_Default.CopyMetaData(TRIMBrokerUtil.MetaData)'的最佳重载方法匹配包含一些无效参数

错误2参数'1':无法从'TRIMBrokerUtil.MetaData []'转换为'TRIMBrokerUtil.MetaData'

我接近了吗?



1> Jon Skeet..:

你已经声明了你的参数MetaData而不是MetaData[]- 换句话说它不是一个数组.你使用的时间utilArray.Name相当多,但目前尚不清楚原因.

我怀疑你真的想要:

protected TRIMBrokerASMXProxy.ASMXProxy.MetaData[]
    CopyMetaData(MetaData[] utilArray)
{
    TRIMBrokerASMXProxy.ASMXProxy.MetaData[] outArray = 
        new TRIMBrokerASMXProxy.ASMXProxy.MetaData[utilArray.Length];
    for (int i = 0; i < utilArray.Length; i++)
    {
        outArray[i] = new TRIMBrokerASMXProxy.ASMXProxy.MetaData();
        outArray[i].Name = utilArray[i].Name;
        outArray[i].Value = utilArray[i].Value;
    }
    return outArray;
}

顺便说一句,您可能需要考虑一个using指令,以便更容易阅读:

using ProxyMetaData = TRIMBrokerASMXProxy.ASMXProxy.MetaData;

...

protected ProxyMetaData[] CopyMetaData(MetaData[] utilArray)
{
    ProxyMetaData[] outArray = new ProxyMetaData[utilArray.Length];
    for (int i = 0; i < utilArray.Length; i++)
    {
        outArray[i] = new ProxyMetaData();
        outArray[i].Name = utilArray[i].Name;
        outArray[i].Value = utilArray[i].Value;
    }
    return outArray;
}

另一种选择是Array.ConvertAll:

ProxyMetaData[] output = Array.ConvertAll(input,
    metaData => new ProxyMetaData(metaData.Name, metaData.Value));

如果您不使用C#3,可以使用匿名方法.如果ProxyMetaData没有一个合适的构造函数,你正在使用C#3,您可以使用一个对象初始化:

ProxyMetaData[] output = Array.ConvertAll(input,
    metaData => new ProxyMetaData { metaData.Name, metaData.Value });

如果你坚持使用C#2而没有合适的构造函数,那么:

ProxyMetaData[] output = Array.ConvertAll(input, delegate(MetaData metaData)
{
    ProxyMetaData proxy = new ProxyMetaData();
    proxy.Name = metaData.Name;
    proxy.Value = metaData.Value;
});

认为这涵盖了所有的基础:)

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有