Смущает на C # Массив объектов и неявное преобразование типов - PullRequest
0 голосов
/ 20 марта 2009

Я пытаюсь передать массив простого объекта в веб-сервис, и я действительно застрял на этой ошибке во время компиляции моего проекта веб-клиента:

Невозможно неявно преобразовать тип '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;
        }
    }
    }

Вот фрагмент веб-сервиса, который также прекрасно компилируется: использование TRIMBrokerUtil; пространство имен TRIMBrokerService { [WebService (Namespace = "http://tempuri.org/")] [WebServiceBinding (ConformsTo = WsiProfiles.BasicProfile1_1)] [ToolboxItem (ложь)] открытый класс 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;
}

Далее (через «Добавить веб-ссылку») у меня есть прокси-класс для веб-службы ASMX в отдельном проекте, и он без проблем компилируется. Внутри сгенерированного файла 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]));
    }

Теперь об ошибке, возникающей при компиляции в проекте веб-клиента (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 [])' имеет недопустимые аргументы

(обратите внимание, что первоначальная ошибка о "невозможно преобразовать" является второй ошибкой).

Извините, что так многословен выше. Надеюсь, вы поможете пролить свет на эту путаницу.

Ответы [ 2 ]

2 голосов
/ 20 марта 2009

Вы пытаетесь присвоить массив TRIMBrokerUtil.MetaData массиву TRIMBrokerASMXProxy.ASMXProxy.MetaData. Помните, что прокси-сервер asp.net объявляет свой собственный тип.

Просто скопируйте данные в новый массив с типом прокси.

1 голос
/ 20 марта 2009

Когда вы добавляете ссылку на веб-сервис, Visual Studio автоматически генерирует код для объектов, которые используются в качестве параметров для функций веб-сервиса. Отсюда ваш класс TRIMBrokerASMXProxy.ASMXProxy.MetaData.

Это не то же самое, что ваш TRIMBrokerUtil.MetaData класс. Вы можете удалить класс из своего TRIMBrokerUtil пространства имен и просто использовать его из прокси-сервера веб-службы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...