8

値のリスト (整数、カスタム クラスなど) を公開する Web サービスを実装する必要があります。私の作業ソリューションは aList<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>内部で a を使用して aを公開するお気に入りの方法は何Collection<T>ですか? (C# を使用し、フレームワーク 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 のブログのコンテキストでは、この場合、呼び出し元と呼び出し先の問題はありません。2 つの間に強制的な障壁があるためです。

WSDL/mex に関しては、3 つすべて (リスト/コレクション/配列) が単に要素のブロックになるのではないかと考えています。

于 2008-10-13T13:05:46.587 に答える
1

私は通常、WCF Web サービスから IList<T> を返します。FxCop はこれで十分満足しています。これが ASMX Web サービスで機能するかどうかは不明です。

于 2008-10-13T14:06:56.057 に答える