ショートバージョン、レイアウトしたとおりに提案していることを実行できません。
より長いバージョン のパート A :
Web サービスはクラスのメソッドのように考えることができ、実際にはWeb サービス クラスから離れたメソッドです。Web サービスのセットアップの背後にあるメカニズムをよりよく理解するために、いくつかの Web サービスのチュートリアルを読むことをお勧めします。MSDN には、お気に入りの検索エンジンで簡単に見つけられる Microsoft スタック固有のチュートリアルが多数あります。
メソッドから返されたオブジェクトは、基本的にあなたが求めているポリモーフィックな動作を持つことはできません。
この擬似コードは、作成しようとしているものと同等であり、コンパイラが許可していないのはそのためです。どちら DoSomething()
に電話をかけようとしているのかはわかりません。
class myFoo
{
public SuccessResponse DoSomething() {....}
public ErrorResponse DoSomething() {....}
}
別の方法として、次のようなことを考えることもできます:
public [SuccessResponse | ErrorResponse] DoSomething()
しかし、それも明らかな理由で失敗します。C# は単にポリモーフィック リターンをサポートしていません。
パート B
だけに焦点を当てたとしてもresp.Data
、そのオブジェクトは何らかの型として宣言する必要があります。
class Response
{
public Collection<someType> Data;
}
SuccessData
と が同じインターフェースをErrorData
実装する場合、someType
単純にそうなる可能性がありますIyourInterface
が、それは別の問題を引き起こします。つまり、エンドユーザーは、適切なデータが提供されたかどうか、または代わりにエラー応答が含まれているかどうかをどのように知ることができますか.Data
IyourInterface
WCFサービス オブジェクトのパブリック部分として宣言する限り、WCF はシリアル化するのに十分な機能を備えていると思います。しかし、それでもエンド ユーザーが何をすべきかを知る方法は解決されません。
応答のエレガンスさを少し下げたい場合は、成功データとエラー オブジェクトを次のように別の応答クラスにまとめるという古典的なパターンがあります。
class myResponse
{
public SuccessResponse myRespData;
public ErrorResponse myError
}
ここで、エンド ユーザーは、問題がなければエラーがないかどうかを確認します。エラーがないと仮定して、応答データを調べます。
あなたのコメントに基づいて、はい、次のこともできます。
class Response
{
public List<IYourData> Data;
public YourEnum ReturnType;
}
public class ResponseData : IYourData { ... }
public class ErrorData : IYourData { ... }
次に、クライアントで、次のような簡単なチェックを実行できます。
if( ReturnType == YourEnum.Success ) { ... }
else if( ReturnType == YourEnum.Error ) { ... }
else ...
WCF が のシリアル化を処理List
します。配置されている設定に応じて、配列に変換するか、コレクションを直接渡します。その特定の側面を処理する SO Q&A がいくつかあります。