Joh*_*ams 1 c# arrays object copying
以前,我遇到了一个问题,试图在我的ASMX webservice和我的.aspx页面之间共享一个类型定义(webclient)
据我所知,这个建议的"问题"可以通过将客户端中创建的对象数组复制到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");
Run Code Online (Sandbox Code Playgroud)
...这里我尝试一个函数从我的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;
}
Run Code Online (Sandbox Code Playgroud)
...然后在这里我尝试调用该函数(编译器在此行标记2个错误:
TRIMBrokerASMXProxy.ASMXProxy.MetaData[] kvData =
CopyMetaData(metaDataArray);
Run Code Online (Sandbox Code Playgroud)
下面的两个编译错误都指向同一行:
错误1'_Default.CopyMetaData(TRIMBrokerUtil.MetaData)'的最佳重载方法匹配包含一些无效参数
错误2参数'1':无法从'TRIMBrokerUtil.MetaData []'转换为'TRIMBrokerUtil.MetaData'
我接近了吗?
你已经声明了你的参数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;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您可能需要考虑一个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;
}
Run Code Online (Sandbox Code Playgroud)
另一种选择是Array.ConvertAll:
ProxyMetaData[] output = Array.ConvertAll(input,
metaData => new ProxyMetaData(metaData.Name, metaData.Value));
Run Code Online (Sandbox Code Playgroud)
如果您不使用C#3,可以使用匿名方法.如果ProxyMetaData没有一个合适的构造函数,你正在使用C#3,您可以使用一个对象初始化:
ProxyMetaData[] output = Array.ConvertAll(input,
metaData => new ProxyMetaData { metaData.Name, metaData.Value });
Run Code Online (Sandbox Code Playgroud)
如果你坚持使用C#2而没有合适的构造函数,那么:
ProxyMetaData[] output = Array.ConvertAll(input, delegate(MetaData metaData)
{
ProxyMetaData proxy = new ProxyMetaData();
proxy.Name = metaData.Name;
proxy.Value = metaData.Value;
});
Run Code Online (Sandbox Code Playgroud)
我认为这涵盖了所有的基础:)