【问题标题】:Confused on C# Array of objects and implicit type conversion对 C# 对象数组和隐式类型转换感到困惑
【发布时间】:2010-10-14 15:14:25
【问题描述】:

我正在尝试将一个简单对象的数组传递给 Web 服务,但在我的 Web 客户端项目的编译过程中我真的遇到了这个错误:

无法将类型“TRIMBrokerUtil.MetaData[]”隐式转换为“TRIMBrokerASMXProxy.ASMXProxy.MetaData[]”

这是我编译成 TRIMBrokerUtil.dll 的“实用程序”项目:

namespace TRIMBrokerUtil
{
    public class MetaData
    {
    protected string _Name;
    protected string _Value;
    public MetaData(string keyword, string setting) 
    {
        this.Name = keyword;
        this.Value = setting;
    }
    public string Name
    {
        get
        {
        return this._Name;
        }
        set
        {
        Name = value;
        }
    }
    public string Value
    {
        get
        {
        return this._Value;
        }
        set
        {
        _Value = value;
        }
    }
    }

这是一个网络服务的 sn-p,它也可以很好地编译: 使用TRIMBrokerUtil; 命名空间 TRIMBrokerService { [WebService(命名空间 = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [工具箱项目(假)] 公共类 FileService:System.Web.Services.WebService {

    [WebMethod]
    public string UploadFile(byte[] incomingArray
        , string FileName
        , long FileLengthInBytes
        , MetaData[] metaDataArray)
    {

...以后的用法如下:

Update update = BuildMetaData(metaDataArray);

...还有这个:

private Update BuildMetaData(MetaData[] nvPairs)
{
    Update update = new Update();
    InputProperty[] ip = new InputProperty[nvPairs.Length];
    int i;
    for (i=0; i < nvPairs.Length; i++)
    {
    ip[i].Name = "udf:" + nvPairs[i].Name;
    ip[i].Val = nvPairs[i].Value;
    }
    update.Items = ip;
    return update;
}

接下来,(通过“添加 Web 引用”)我将我的 ASMX Web 服务代理类放在一个单独的项目中,它可以毫无问题地编译。在生成的 reference.cs 文件中,我发现这看起来不错:

    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/UploadFile", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    public string UploadFile([System.Xml.Serialization.XmlElementAttribute(DataType="base64Binary")] byte[] incomingArray, string FileName, long FileLengthInBytes, MetaData[] metaDataArray) {
        object[] results = this.Invoke("UploadFile", new object[] {
                    incomingArray,
                    FileName,
                    FileLengthInBytes,
                    metaDataArray});
        return ((string)(results[0]));
    }

现在针对web客户端项目(default.aspx.cs)编译时出现的错误:

    using TRIMBrokerUtil;

public partial class _Default : System.Web.UI.Page
{
    private void UploadFile(HttpPostedFile postedFile
                , string fileNameOnly
                , MetaData[] metaDataArray)
    {
        string strURI = string.Empty;
        TRIMBrokerASMXProxy.ASMXProxy.FileService client = new TRIMBrokerASMXProxy.ASMXProxy.FileService();
        BinaryReader b = new BinaryReader(postedFile.InputStream);
        byte[] binData = b.ReadBytes(numBytes);
        TRIMBrokerASMXProxy.ASMXProxy.MetaData[] kvData = metaDataArray; // error complains about this line
        strURI = client.UploadFile(binData, fileNameOnly, binData.Length, kvData );

我还尝试将上面的最后两行更改为仅此一行:

strURI = client.UploadFile(binData, fileNameOnly, binData.Length, metaDataArray);

...但是该更改会从编译器中引入第二个错误,内容如下:

'TRIMBrokerASMXProxy.ASMXProxy.FileService.UploadFile(byte[], string, long, TRIMBrokerASMXProxy.ASMXProxy.MetaData[])' 的最佳重载方法匹配有一些无效参数

(请注意关于“无法转换”的原始错误是第二个错误)。

对不起,上面写得这么冗长。希望您能帮助阐明这种困惑。

【问题讨论】:

    标签: c# arrays object type-conversion


    【解决方案1】:

    您正在尝试将 TRIMBrokerUtil.MetaData 数组分配给 TRIMBrokerASMXProxy.ASMXProxy.MetaData 数组。请记住,asp.net 代理声明了自己的类型。

    只需将数据复制到具有代理类型的新数组中即可。

    【讨论】:

    • 弗雷迪,不确定您的意思:“复制数据”。循环?
    • y,一个循环,一个带有 ToArray 的 linq,任何将数据从数组复制到当前循环的新数组的方法。
    • 我几乎不懂 C#,而且我似乎偶然发现了一些“高级”的东西。显然,我在服务和客户端之间共享类型定义的尝试受到了阻碍,因为代理“声明了自己的类型”。所以,我会尝试从我的预期类型复制到代理的类型。有没有更好的方法来做到这一点?
    • Y,asmx 的方式不直接支持共享类型。新方式 (WCF) 支持共享类型,但正如您学习的那样,我会坚持简单。只是避免以您需要共享类型的方式这样做。
    【解决方案2】:

    当您添加对 Web 服务的引用时,Visual Studio 将自动为用作 Web 服务功能参数的对象生成代码。这就是您的 TRIMBrokerASMXProxy.ASMXProxy.MetaData 课程的来源。

    这与您的TRIMBrokerUtil.MetaData 课程不同。您可以从 TRIMBrokerUtil 命名空间中删除该类,而只使用 Web 服务代理中的类。

    【讨论】:

      猜你喜欢
      • 2011-02-02
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多