8

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

您最喜欢在内部使用 aList<T>和公开 a 的方式是Collection<T>什么?(使用 C#,最好只使用 framework 2.0)

4

2 回答 2

14

List<T> 或 Collection<T> 在这种情况下很好。

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

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

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

由于您处于 Web 服务边界,因此 FxCop 的建议不适用。这对于防止调用者踩踏被调用者的内存很有用(与Eric Lippert 最近的博客一致) - 但在 Web 服务分布式场景中根本不适用。事实上,由于 web 服务在某些通用场景中存在一些有据可查的问题,因此可以说简单的数组在 web 服务边界上是非常有用和实用的。在 Eric 博客的上下文中 - 在这种情况下,调用者/被调用者问题没有问题,因为两者之间存在强制障碍。

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

于 2008-10-13T13:05:46.587 回答
1

I usually return IList<T> from a WCF web service: FxCop is happy enough with this. Not sure if this works with ASMX web services.

于 2008-10-13T14:06:56.057 回答