使用列表<T>和公开集合<T>的最佳方式



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

如果我选择返回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)

List<T>或集合<T>在这种情况下都很好。

就原始问题而言,您可以将List<T>在集合<T>很简单:

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

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

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

就WSDL/mex而言,我怀疑所有3个(list/collection/array)都将成为一个元素块,因此您可以选择最方便的元素。

我通常返回IList<T>来自WCF web服务:FxCop对此非常满意。不确定这是否适用于ASMX web服务。

相关内容

  • 没有找到相关文章

最新更新