2016-04-03 3 views
0

я получаю эту ошибкуПреобразовать объект C# .net массив в другой

Ошибка Не удается преобразовать тип TestMVC.GetServiceRequests.serviceRequests[] в System.Collections.Generic.IEnumerable<TestMVC.Models.ServiceRequest>

Я пытаюсь скопировать .net массив объектов из веб-сервиса в другой .net C#, и оба они имеют одну и ту же структуру.

Я попробовал литье типа, но это не сработало.

var serviceRequest = svcClient.GetServiceRequests(getServiceRequest).responseData; 
return (IEnumerable<ServiceRequest>) serviceRequests; 




ServiceRequest[] serviceRequests = new ServiceRequest[] 
{ 
    new ServiceRequest { customerName = "Customer123", contactName = "Pat Nelson", vin = "4DRBUAFN75A977722", unitNo = "275", serviceRequestId = "1", requestedDate = "08/08/15", requestedTime = "PM", connectCompleted = "true", 
            captureCompleted = "false", collectCompleted = "false", agreeCompleted = "false", updateDate = "08/17/2015", createDate = "08/17/2015", note = "note note note note note note note note note note note note note note note note note note note note note note note note note note ", userId = "yyy1ri3"}, 

    new ServiceRequest { customerName = "Customer456", contactName = "Pat Nelson", vin = "1HSMTAAN1DH328986", unitNo = "325", serviceRequestId = "2", requestedDate = "09/01/15", requestedTime = "AM", connectCompleted = "false", 
            captureCompleted = "true", collectCompleted = "true", agreeCompleted = "false", updateDate = "08/17/2015", createDate = "08/17/2015", note = "note note note note note note note note note note note note note note note note note note note note note note note note note note ", userId = "yyy1ri3"}, 

}; 
+4

Пожалуйста, внесите фактический код. – Dai

+2

написать свой код? –

+0

Какой вид веб-сервиса вы используете? WCF или что-то еще? – NineBerry

ответ

0

Два типа

TestMVC.GetServiceRequests.serviceRequests[] 

и

System.Collections.Generic.IEnumerable<TestMVC.Models.ServiceRequest> 

не совпадают.

Учитывая, что они имеют одинаковую структуру. Вы можете сопоставить два типа, чтобы получить нужный тип результата. Затем преобразуйте полученный набор в массив с помощью метода расширения ToArray.

Это ручной способ сделать.

public ServiceRequest[] SomeMethod() { 
    //..other code 
    TestMVC.GetServiceRequests.serviceRequests[] serviceRequests = svcClient.GetServiceRequests(getServiceRequest).responseData; 

    return serviceRequests.Select(s=> new ServiceRequest { 
     customerName = s.customerName, 
     contactName = s.contactName, 
     //...etc... 
    }).ToArray(); 
} 

есть отображающие рамки вы можете использовать, чтобы сделать тяжелую работу за вас, если вы возражаете имеет много свойств. Одним из таких инструментов является TinyMapper

, которые могут быть использованы как

public ServiceRequest[] SomeMethod() { 
    //..other code 
    TestMVC.GetServiceRequests.serviceRequests[] serviceRequests = svcClient.GetServiceRequests(getServiceRequest).responseData; 

    return serviceRequests.Select(s=> TinyMapper.Map<ServiceRequest>(s)).ToArray(); 
} 
+0

Я получаю ошибку времени выполнения. – user2180842

+0

System.InvalidCastException не был обработан кодом пользователя HResult = -2147467262 Сообщение = Не удалось наложить объект типа 'System.Collections.Generic.List'1 [TestMVC.GetServiceRequests.serviceRequests]' для ввода 'System.Collections.Generic. IEnumerable'1 [TestMVC.Models.ServiceRequest]. – user2180842

+0

Теперь видя обновленный вопрос. внесут изменения – Nkosi

1

При импорте веб-службы в качестве ссылки в Visual Studio, новые классы автоматически создаются для объектов, возвращаемых из вызовов на веб-службы.

В этом случае методы GetServiceRequests() возвращают список объектов класса serviceRequests. Этот класс был автоматически создан Visual Studio.

Вы не можете назначать объекты этого класса своему классу ServiceRequest, даже если классы имеют одинаковые свойства.

Так что вам нужно работать с классом, созданным Visual Studio, а не с вашим собственным классом.

Если веб-служба является веб-сервисом WCF или ASMX, вы можете сообщить Visual Studio не создавать собственные классы для объектов, возвращаемых веб-службой. Для того, чтобы это сработало, обычно используемый класс (в данном случае ServiceRequest) должен быть объявлен в отдельной сборке, на которую ссылаются как веб-служба, так и клиент, вызывающий веб-сервис. Затем, когда вы добавляете ссылку webservice к клиенту, откройте диалоговое окно «Дополнительно» и включите «Типы повторного использования в ссылочных сборках».

Если это какой-либо другой веб-сервис, это невозможно.

1

Ошибка указывает (правильно), что массив одного типа не может быть отличен как IEnumerable другого типа.

Один - TestMVC.GetServiceRequests.serviceRequests, а другой - TestMVC.Models.ServiceRequest.

Не имеет значения, имеют ли они одну и ту же структуру. Один тип не будет автоматически преобразован в другой.

Не думайте об этом как об ошибке - компилятор предупреждает об ошибке.

Кастинг класса как другого класса или интерфейса работает только тогда, когда класс получен из этого класса или наследует этот интерфейс.

Если у вас есть экземпляр класса A (или массив), и вы хотите, чтобы класс B, и оба они имели одинаковые свойства, тогда вам нужно создать новый экземпляр B и скопировать его свойства из A. (In другими словами, картирование.)

Смежные вопросы