2016-04-03 40 views
0

我得到这个错误转换C#.NET对象数组到另一个

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

我想.NET对象数组从web服务复制到其他.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

你使用什么样的Webservice? 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 Message =无法强制类型为“System.Collections.Generic.List'1 [TestMVC.GetServiceRequests.serviceRequests]'的对象类型为System.Collections.Generic。 IEnumerable'1 [TestMVC.Models.ServiceRequest]”。 – user2180842

+0

现在看到更新的问题。将进行更改 – Nkosi

1

当你输入一个Web服务在Visual Studio中参考使用,会自动创建新的类的对象从调用Web服务返回。

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

即使将类定义为具有完全相同的属性,也不能将该类的对象指定给您自己的类ServiceRequest

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

如果Web服务是WCF或ASMX Web服务,那么可以告诉Visual Studio不要为Web服务返回的对象创建自己的类。 为了达到此目的,常用的类(在本例中为ServiceRequest)必须在由webservice和调用webservice的客户端引用的单独程序集中声明。然后,当您将webservice引用添加到客户端时,打开“高级”对话框并启用“在引用的程序集中重用类型”。

如果是某种其他类型的Web服务,则这是不可能的。

1

错误表明(正确)一种类型的数组不能转换为另一种类型的IEnumerable

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

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

不要认为它是一个错误 - 编译器正在防止错误。

将类作为另一个类或接口进行转换只适用于从该类派生类或继承该接口的类。

如果你有一个类A(或数组)的实例,并且你想要类B,并且都方便地具有相同的属性,那么你需要创建一个B的新实例并从A中复制它的属性。换句话说,映射。)