2011-10-07 51 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