2011-06-20 41 views
0

我來到了一個問題,我找不到一個很好的解決方案 - 我有一個WCF服務,我想要返回從FatherClass繼承的ChildClass對象。WCF和各種返回歸類

大多數情況下,我會返回ChildClass,但在某些情況下,我想只返回FatherClass(它只包含1個字段「錯誤」)。

這可以完成嗎?

我的代碼:

[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

@roman:如果你不用'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(); 
     } 
    } 

The cast ChildClass d =(ChildClass)a;將失敗。所以你可以嘗試修改你的簽名到

public FatherClass GetCollection(parameter) 

並使用適當的類型轉換。

+0

感謝你的詳細解答。我不相信它會起作用,因爲如果我傳遞ChildClass,WCF將不會將它序列化到ChildClass。我在那個上遇到了一個錯誤。 – Roman