web-dev-qa-db-ja.com

私が期待していたように、WCFがList <T>ではなくmyObject []を返すのはなぜですか?

WCFメソッドからListを返しています。私のクライアントコードでは、戻り値の型はMyObject []として表示されます。 MyObject []、IList、またはIEnumerableを使用する必要があります...

WCFClient myClient = new WCFClient();

    MyObject[] list = myClient.GetMyStuff();
or
    IList<MyObject> list = myClient.GetMyStuff();
or
    IEnumerable<MyObject> list = myClient.GetMyStuff();

私がしているのは、このコレクションを取得してグリッドにバインドすることだけです。返されたコレクションを割り当てるのに最適なオブジェクトは何ですか?

63
ScottG

参照を追加するときに[詳細設定]ボタンをクリックして、配列の代わりに汎用リストを使用するように指定するか、サービス参照を右クリックして[構成]を選択し、その場で変更します。

その理由は、WCFが汎用リストを配列としてシリアル化し、ネットワーク経由で送信するためです。構成は、便宜のために汎用リストに変換するプロキシを作成するようにsvcutilに指示しているだけです。

83
Stever B

svcutil.exeを使用してクライアントコードを作成する場合、使用できない特定の参照を解決する方法を伝える必要があります。

これは、List<T>に対して行う方法です。

svcutil /o:YourService.cs /ct:System.Collections.Generic.List`1 http://example.com/mex
13
Andrew Hare

スティーバーBは正しいです。 WCFは、.NETに結合しないように一生懸命努力しています。 Javaクライアントがコンポーネントに接続できるようにしたい場合があります。配列は相互運用可能です。汎用.NETリストはそうではありません。

ただし、配列をリストなどの必要なものに変換する独自のプロキシクラスを作成することは大歓迎です。独自のプロキシを手動で作成することの良い点は、それらが行うことを完全に制御できることです。

8
Tad Donaghe

クライアントプロジェクトにサービス参照を追加する場合、[詳細設定]ボタンをクリックし、コレクションタイプを配列から目的のタイプに変更します...

2
Jason Punyon