使用List <T>和公开Collection <T>的最佳方法

ale*_*rul 8 c# generics web-services fxcop

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

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

要进行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)

Mar*_*ell 14

在这种情况下,List <T>或Collection <T>都可以.

就原始问题而言,您可以非常简单地将List <T>包装在Collection <T>中:

List<Foo> list = new List<Foo>();
// ...
Collection<Foo> col = new Collection<Foo>(list);
Run Code Online (Sandbox Code Playgroud)

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

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

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