2008-10-13 52 views
8

的最佳方式我必須實現一個Web服務,它顯示值(整數,自定義類等)的列表。 我的工作解決方案返回List<T>,根據FxCop,最好返回Collection<T>ReadOnlyCollection<T>使用列表<T>和公開收集<T>

如果我選擇返回一個ReadOnlyCollection<T>,Web服務顯示了一個錯誤,如:

要XML序列化,從ICollection繼承的類型必須在其繼承層次結構的各個層次的Add(System.Int32)的實現。 System.Collections.ObjectModel.ReadOnlyCollection1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]不執行Add(System.Int32)

什麼是你最喜歡的方式使用內部List<T>和揭露Collection<T>? (使用C#,最好是框架2.0)

回答

14

列表<T>或集合<T>在這種情況下很好。

在原來的問題而言,你可以在一個集合<牛逼>很乾脆換一個List <牛逼>:

List<Foo> list = new List<Foo>(); 
// ... 
Collection<Foo> col = new Collection<Foo>(list); 

這是一個真正的包裝;將一個項目添加到包裝(col)中,並將其添加到列表中。這可能會有些混亂,因爲許多這樣的構造函數使用參數來完成初始填充,但不鏈接到原始列表。收集<T>是個例外;-p

由於您處於Web服務邊界,因此FxCop的建議不適用。這很有用(與Eric Lippert's recent blog一致),以防止主叫方在被叫方的內存中跺腳 - 但是在Web服務分佈式情況下,這種情況根本不適用。事實上,由於Web服務在某些通用場景中有一些有據可查的問題,因此一個簡單的數組在Web服務邊界上可以說是非常實用和實用的。在Eric的博客中 - 在這種情況下,由於兩者之間存在強制屏障,所以不存在呼叫者/被叫者問題的問題。我懷疑所有的3(​​list/collection/array)都會成爲一個元素塊 - 所以你可以用最方便的方式去做。

+0

感謝您的回答,以及有關Collection作爲真正包裝的細節,我之前沒有找到任何關於它的信息。 – alexandrul 2008-10-14 08:52:12

1

我通常從WCF Web服務返回IList <T>:FxCop對此很滿意。 不確定這是否適用於ASMX Web服務。

+0

ASMX Web服務不會序列化(並且會提供運行時異常)接口。 – 2010-08-11 21:33:13

相關問題