【问题标题】:Can you use interfaces as DataMembers in WCF?您可以在 WCF 中将接口用作 DataMembers 吗?
【发布时间】:2012-08-03 16:48:37
【问题描述】:

你能做到吗?

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

注意成员 Endpoint 是一个接口 (IEndpoint),而不是一个类。 WCF 会允许这样做吗?

【问题讨论】:

  • 认为它会的,只要你为你的Endpoint 属性所拥有的任何具体的IEndpoint 实现也用DataContractAttribute 和适当的DataMemberAttribute 装饰s 在其成员上。 编辑:加上Aasmund said 关于KnownTypeAttributes 的内容。

标签: c# wcf interface


【解决方案1】:

我认为你可以(但我还没有测试过),但是你需要用[KnownType]声明该接口的所有实现:

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

每个实现类都必须有一个[DataContract] 属性。

【讨论】:

    【解决方案2】:

    WCF 中的 DataContractAttribute 不适用于接口:See the documentation here

    answer in this question 可能会让您更好地了解原因。

    【讨论】:

    • 他将[DataContract] 应用于一个类,并将[DataMember] 应用于一个属性。
    【解决方案3】:

    是的,当然您可以在 DataContract 中将接口作为 DataMember.. 然后你必须在 KnownType 属性中指定所有的接口实现...

     [DataContract]
        [KnownType(typeof(ActivityDC))]
        [KnownType(typeof(StepDC))]
        [KnownType(typeof(WaveDC))]
        public class CampaignDC : AuditedEntityBaseDC
        {
            [DataMember]
            public IList<IActivityDC> Activities { get; set; }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多