2011-06-20 13 views
0

私は良い解決策を見つけることができませんでした。私は、FatherClassから継承したChildClassのオブジェクトを返すWCFサービスを持っています。WCFと様々な戻り値がクラス

ほとんどの場合、私はChildClassを返しますが、場合によってはFatherClass(これはただ1つのフィールド "error"を保持しています)を返したいとします。

これを達成できますか?

マイコード:

[WebGet(UriTemplate = "SomeQueryString", ResponseFormat = System.ServiceModel.Web.WebMessageFormat.Json)] 
public ChildClass GetCollection(parameter) 
{ 

    if (err) 
    { 
     return new FatherClass(); 
    } 
    else 
    { 
     return new ChildClass(); 
    } 
} 

ChildClassがFatherClass(以下のフィールドがあります)を継承して。

私の目的は、ChildClassオブジェクト全体を返すと返されるテキストではなく、「テキスト」のごく一部しか返さないことです。

アイデア? :)

ありがとう!あなたの操作との契約を再定義する場合にのみ可能である

答えて

3

- あなたは親とシリアライザを返さなければならない代わりに親を用いることができ、すべての子供たちを知っている必要があります。

[KnownType(typeof(ChildClass)] 
[DataContract] 
public class ParentClass 
{ 
    // DataMembers 
} 

[DataContract] 
public class ChildClass : ParentClass 
{ 
    // DataMembers 
} 

そして、あなたの操作は次のようになります。

[WebGet(UriTemplate = "SomeQueryString", ResponseFormat = System.ServiceModel.Web.WebMessageFormat.Json)] 
public ParentClass GetCollection(parameter) 
{ 
    ... 
} 
+0

ありがとうございました。私は、 "ServiceKnownTypeAttributeを使用して操作のための既知の型コレクションに型を追加する"を含むエラーを取得しますが、正しい方向に向いているようです。インターフェイスも追加する必要がありますか? – Roman

+0

今後の参考のために、サービス自体に[ServiceKnownType(typeof(ChildClass))]を追加することができませんでした。 – Roman

+0

@ローマン:それは 'KnownType'で基底型を指定しないとそうする別の方法です –

0

これはC#とタイプキャストに関する質問だと思います。あなたが持っているので、ChildClass:FatherClassのために動作しません。以下を参照してください。

class FatherClass 
    { 
     public int x { get; set; } 
    } 

    class ChildClass : FatherClass 
    { 
     public int y { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      FatherClass a = new FatherClass(); 
      ChildClass b = new ChildClass(); 


      FatherClass c = (FatherClass)b; 
      ChildClass d = (ChildClass)a; 

      Console.ReadLine(); 
     } 
    } 

キャストChildClass d =(ChildClass)a;失敗するでしょう。したがって、署名を

public FatherClass GetCollection(parameter) 

に変更して、適切なタイプキャストを使用してみることができます。

+0

詳細な答えをありがとう。 ChildClassを渡すと、WCFはそれをChildClassにシリアル化しないため、動作しないと私は思います。私はその1つにエラーを取得します。 – Roman