将C#.net对象数组转换为另一个

时间:2016-04-03 02:18:03

标签: c# web-services

我收到此错误

  

错误无法将类型TestMVC.GetServiceRequests.serviceRequests[]转换为System.Collections.Generic.IEnumerable<TestMVC.Models.ServiceRequest>

我正在尝试将.net对象数组从webservice复制到另一个.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"},

};

3 个答案:

答案 0 :(得分:1)

在Visual Studio中导入Web服务作为引用时,将自动为从调用Web服务返回的对象创建新类。

在这种情况下,GetServiceRequests()方法返回类serviceRequests的对象列表。该类由Visual Studio自动创建。

即使将类定义为具有完全相同的属性,也无法将该类的对象分配给您自己的类ServiceRequest

因此,您需要使用Visual Studio创建的类而不是您自己的类。

如果Web服务是WCF或ASMX Web服务,您可以告诉Visual Studio不要为Web服务返回的对象创建自己的类。 为了使其工作,常用的类(在本例中为ServiceRequest)必须在Web服务和调用Web服务的客户端引用的单独程序集中声明。然后,当您将webservice引用添加到客户端时,打开&#34; Advanced&#34;对话框并启用&#34;在引用的程序集中重用类型&#34;。

如果是其他类型的Web服务,则无法实现。

答案 1 :(得分:1)

错误指示(正确地)一种类型的数组不能转换为不同类型的IEnumerable

一个是TestMVC.GetServiceRequests.serviceRequests,另一个是TestMVC.Models.ServiceRequest

它们是否具有相同的结构并不重要。一种类型不会自动转换为另一种类型。

不要将其视为错误 - 编译器正在阻止错误。

将类作为另一个类或接口进行转换只有在从该类派生类或继承该接口时才有效。

如果你有一个A类(或数组)的实例并且你想要B类,并且两者都方便地拥有相同的属性,那么你需要创建一个B的新实例并从A复制它的属性。(在其他单词,映射。)

答案 2 :(得分: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();
}