2012-08-03 2 views
4

Вы можете это сделать?Можете ли вы использовать интерфейсы как DataMembers в WCF?

[DataContract] 
public class RegisterEndpointRequest : NotificationRegistrationServiceRequest 
{ 
    [DataMember] 
    public IEndpoint Endpoint { get; set; } 
} 

Обратите внимание на конечной точке элемент представляет собой интерфейс (IEndpoint), а не класс. Разрешит ли WCF это?

+0

* Я думаю, что это будет * , до тех пор, пока какая-либо конкретная реализация 'IEndpoint' у вас для вашего свойства Endpoint' также украшена' DataContractAttribute' и соответствующим 'DataMemberAttribute' для своих членов. ** EDIT **: Плюс, что [Aasmund сказал] (http://stackoverflow.com/a/11800139/74757) о 'KnownTypeAttribute'. –

ответ

3

DataContractAttribute в WCF не предназначен для использования на интерфейсе: See the documentation here

answer in this question может дать вам лучше понять, почему.

+1

Он применяет '[DataContract]' к классу и '[DataMember]' к свойству. –

+0

Я только что отредактировал свой ответ :) – chridam

5

Я думаю, что вы можете (но я не проверял), но вам нужно будет объявить все реализации этого интерфейса с [KnownType]:

[DataContract] 
[KnownType(typeof(EndpointImplA))] 
[KnownType(typeof(EndpointImplB))] 
public class RegisterEndpointRequest : NotificationRegistrationServiceRequest 
{ 
    [DataMember] 
    public IEndpoint Endpoint { get; set; } 
} 

Каждый класс реализации должен иметь атрибут [DataContract].

0

Да, конечно, вы можете иметь интерфейс, как DataMember внутри DataContract .. Тогда вы должны иметь указание всех реализаций интерфейсу по в KnownType атрибуты ...

[DataContract] 
    [KnownType(typeof(ActivityDC))] 
    [KnownType(typeof(StepDC))] 
    [KnownType(typeof(WaveDC))] 
    public class CampaignDC : AuditedEntityBaseDC 
    { 
     [DataMember] 
     public IList<IActivityDC> Activities { get; set; } 
Смежные вопросы