无法将通用列表作为参数发送到WCF方法

时间:2011-10-07 10:58:03

标签: c# wcf generics

我有一个WCF服务,其中一个方法(或操作合同)使用某种类型的通用列表作为参数,但是当我尝试使用此服务,并调用此特定方法时,我收到此错误< / p>

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

我不知道为什么需要一个对象数组而不是消费者代码中的通用列表。

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

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

您的回复或其他人回复的链接将不胜感激。

更新 当我尝试添加服务引用时,我得到此窗口,此处找不到任何设置

enter image description here

3 个答案:

答案 0 :(得分:4)

由于您仍在使用VS2005,并且您的代理生成器显然希望将其转换为数组参数,因此无论何时调用此方法,您都必须将List<T>转换为T[]

由于您有一个List<T>实例,因此您可以使用其ToArray方法(自.NET 2.0起支持)。因此,您可以执行SomeMethod(myList)

,而不是调用SomeMethod(myList.ToArray())

答案 1 :(得分:1)

  

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

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

如果您输入以下代码:

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

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

除非您有关于可能造成问题的更多信息,否则我会说使用ToArray()并完成。

答案 2 :(得分:0)

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