2011-10-07 49 views
1

我有一个WCF服务,其中方法(或操作合同)之一使用某种类型的通用列表作为参数,但是当我尝试消费此服务,并调用这个特殊的方法我得到这个错误不能发送通用列表作为参数WCF方法

Cannot convert type 'System.Collections.Generic.List<CA.CCS.sCmd>' to 'CA.CCS.sCmd[]' 

我不知道为什么一个对象数组预期,而不是在消费者代码的通用列表。

我想仅将此参数作为通用列表发送,而不会在客户端或服务器上进行任何转换,因为它会妨碍服务性能。

我发现了类似的堆栈溢出问题,但没有解决我的问题。

您的回应,或链接到其他的回应将不胜感激。

更新: 我得到这个窗口时,我尝试添加服务引用,不能因为你还在使用VS2005发现这里

enter image description here

+0

检查你的代理生成器的设置 - 也许你选择使用List/ObservableCollection数组? – Carsten

+0

@Carsten,我还没有做过这样的设置。我甚至不知道如何检查。你可以指导我请 – Bravo

+0

你可以在“添加服务参考”对话框中设置那些 – Carsten

回答

4

任何设置,和你的代理生成明显想把它变成一个数组参数,只要你调用这个方法,你只需要将你的List<T>转换为T[]即可。

既然你有一个List<T>实例,你可以使用它的ToArray方法(从.NET 2.0开始支持)。因此,不要致电SomeMethod(myList),您可以做SomeMethod(myList.ToArray())

+0

这正是我所做的,谢谢 – Bravo

0

特定集合类型信息在导出到wsdl时在元数据中丢失,换句话说,服务和消费者之间的集合发送表示为数组。您可以访问this page并转到“自定义集合类型”部分,看看如何创建自定义集合,并在合同揭露,或查看this tutorial

1

我想发送参数作为唯一通用的清单,而无需在客户端任何转换或 服务器,因为它妨碍了服务性能。

有一些我不明白在这里:你调用一个WCF服务,所以要么滥用它发送大量的数据,要么没有性能问题。此外,我认为你对这里的表现感到不知所措。你期望什么样的性能问题? 即使您有一个非常大的列表:如果它只包含引用类型,数组只是一个较小的指针列表。只有当您有大量的结构或其他值类型时,才会出现性能问题,但仍然有10,000个double值的列表只使用大约80kb的内存。

如果你键入此代码:

List<int> myList = new List<int>(); 
for (int i = 0; i < 10000; i++) 
    myList.Add(i); 

你可能已经编写了一个更大的性能问题。

除非你有更多的信息可以产生一个问题,我会说使用ToArray()并完成。

+0

我没有非常大的数据列表,但这种类型的数据将被许多客户端通过互联网在单个服务器上多次传输,这就是我担心的原因,但与在你的解释的帮助下,现在我可以使用.ToArray()函数。 :) 谢谢 – Bravo