2010-04-27 57 views
0
[DataContract] 
Base 
{ 
    [DataMember] 
    public int Id {get;set;} 
} 

[DataContract] 
A : Base 
{ 
    [DataMember] 
    public string Value {get;set;} 
} 

[ServiceContract] 
interface IService 
{ 
    [OperationContract] 
    void SetValue (Base base); 
} 

有沒有辦法使用的服務,如以下樣式:您標記此WCFWCF inhereted模式

new Service().SetValue (new A()); 

回答

0

除了像@Flo所示的那樣改變您調用服務的方式外,您還需要做一些小改動來準備Data Contract Serializer來處理繼承層次結構。

這樣做的最簡單方法是裝飾基於KnownTypeAttribute。像這樣,

[DataContract] 
[KnownType(typeof(A))] 
Base 
{ 
    [DataMember] 
    public int Id {get;set;} 
} 

[DataContract] 
A : Base 
{ 
    [DataMember] 
    public string Value {get;set;} 
} 
+0

是的,但通過這種知道的方式;對於我添加的所有新課程,我也在基礎中添加了一個知識類型。 – 2010-05-01 16:55:54

+0

的確如此 - 但看看戴維布里昂的已知類型供應商:http://davybrion.com/blog/2008/07/the-known-type-provider/ – 2010-05-04 08:14:50

1

所以我假設你想使用它。

您需要使用ChannelFactory連接到端點,然後打開通道。

這是行不通的:

new Service().SetValue (new A()); 

你需要做的不便。像這樣:

using (var scf = new ChannelFactory<IService>(<Binding>,<EndpointAddress>) 
{ 
    IService proxy = scf.CreateChannel(); 
    proxy.SetValue(new (A)); 
} 

這將返回一個實現IService接口的代理對象。你可以在這個對象上調用SetValue。