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.ReadOnlyCollection1[[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(列表/集合/数组)将只是一个元素块 - 所以你可以选择最方便的.