Запутался в C#: Массив объектов и неявное преобразование типов
-
21-08-2019 - |
Вопрос
Я пытаюсь передать массив простого объекта в веб-службу, и я действительно застрял в этой ошибке во время компиляции моего проекта веб-клиента:
Невозможно неявно преобразовать тип «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)] [ToolboboboxItem (false)] открытый класс 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[])» имеет несколько недопустимых аргументов.
(обратите внимание, что исходная ошибка «невозможно преобразовать» — это вторая ошибка).
Извините, что так многословно выше.Надеюсь, вы поможете пролить свет на эту путаницу.
Решение
Вы пытаетесь назначить массив TRIMBrokerUtil.MetaData массиву TRIMBrokerASMXProxy.ASMXProxy.MetaData.Помните, что прокси-сервер asp.net объявляет свой собственный тип.
Просто скопируйте данные в новый массив с типом прокси.
Другие советы
Когда вы добавляете ссылку на веб-службу, Visual Studio автоматически генерирует код для объектов, которые используются в качестве параметров функций веб-службы.Здесь ваш TRIMBrokerASMXProxy.ASMXProxy.MetaData
класс происходит от.
Это не то же самое, что ваш TRIMBrokerUtil.MetaData
сорт.Вы можете удалить курс из своего TRIMBrokerUtil
пространство имен и вместо этого просто используйте пространство прокси-сервера веб-службы.