以前,我遇到了一个问题,试图在我的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'
我接近了吗?
你已经声明了你的参数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; });
我认为这涵盖了所有的基础:)