2011-11-03 63 views
0

我有一個DataContract,我用它作爲WCF服務的返回類型。返回DataContract的子類

[DataContract] 
public NameResult 
{ 
    [DataMember] 
    public string Name { get; set; } 
} 

不過,我想存儲在服務端的附加信息,所以我創建一個子類:

internal ServiceNameResult : NameResult 
{ 
    internal Guid ID { get; set; } 
} 

但是,似乎我無法使用此情況下,結果值(我得到的客戶端上的錯誤是不是非常有幫助 - 無法識別的錯誤109(0x6d)

基本上,如果我這樣做,

NameResult GetName() 
{ 
    NameResult result = {...} 
    return result; 
} 

然後,它的工作,但如果我這樣做;

NameResult GetName() 
{ 
    ServiceNameResult result = {...} 
    return result; 
} 

它沒有。我真的不想將這些屬性從ServiceNameResult複製到新的NameResult。希望有一種方法可以做到這一點?

我已經在子類上放了[IgnoreDataMember],但這沒什麼區別。

謝謝。

回答

0

這裏是解決這個問題的途徑之一。你可以使用組合來實現你在找什麼:

internal class ServiceNameResult 
{ 
    object OtherInformation { get; set; } 

    NameResult Result { get; set; } 
} 

所以,你的內部服務實現可以撐到客戶端返回的對象以及其他信息的引用,但你不污染你的界面。

+0

通常情況下,我會這樣做,但數據協定比這個功能稍微有點功能,我需要能夠透明地使用進入服務的實例(即NameResult)與服務中的實例(ServiceNameResult)相似,就好像它們是相同的。 – Barg

+0

@ user302699 - 在您的場景中將當前數據合同中的行爲移至擴展方法或類似行爲可行嗎? – RQDQ

0

你需要定義ServiceNameResult爲known type

+0

但子類是內部的,需要保持這種方式。超類(NameResult)在單獨的共享程序集中定義 – Barg