使用List <t>和公开Collection <t> </t> </t>的最佳方式

时间:2008-10-13 13:01:44

标签: c# web-services generics fxcop

我必须实现一个公开值列表(整数,自定义类等)的Web服务。 我的工作解决方案返回List<T>,根据FxCop,最好返回Collection<T>ReadOnlyCollection<T>

如果我选择返回ReadOnlyCollection<T>,则网络服务会显示如下错误:

  

要进行XML序列化,从ICollection继承的类型必须在其继承层次结构的所有级别都具有Add(System.Int32)的实现。   System.Collections.ObjectModel.ReadOnlyCollection 1 [[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]未实施Add(System.Int32)

您最喜欢在List<T>内部使用并展示Collection<T>的方式是什么? (使用C#,最好只使用框架2.0)

2 个答案:

答案 0 :(得分:14)

列表与LT; T&GT;或集合&lt; T&gt;在这种情况下很好。

就原始问题而言,您可以包装List&lt; T&gt;在集合&lt; T&gt;中很简单:

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

这是一个真正的包装器;将一个项添加到包装器(col),它将被添加到列表中。这可能有点令人困惑,因为许多此类构造函数使用参数来执行初始填充,但不链接到原始列表。收集和LT; T&GT;是一个例外;-p

由于您处于Web服务边界,因此FxCop的建议不适用。这很有用(内联Eric Lippert's recent blog)来防止调用者踩踏被调用者的内存 - 但是在一个不适用的Web服务分布式场景中。实际上,由于Web服务在某些通用场景中存在一些记录良好的问题,因此简单的阵列在Web服务边界上可以说非常实用且务实。在Eric的博客中 - 在这种情况下,不存在调用者/被调用者问题,因为两者之间存在强制执行障碍。

就WSDL / mex而言,我怀疑所有3(列表/集合/数组)将只是一个元素块 - 所以你可以选择最方便的。

答案 1 :(得分:1)

我通常会返回IList&lt; T&gt;来自WCF Web服务:FxCop对此很满意。 不确定这是否适用于ASMX Web服务。