如何在WCF中将接口标记为DataContract

我有两个数据类,只保存数据成员(没有函数)。 一个是CallTask ,另一个是SmsTask 。 这两个类有一些常见的属性,如IDTel 。 我将这些常见属性放在一个单独的接口类中,并在适当的时候在我的项目中使用此接口类。
现在我在我的项目中添加了一个WCFService,以便在客户端和服务器之间共享数据。 考虑以下类设计:

public interface IGsmTask : IComparable { string TaskID { get; set; } string SessionID { get; set; } string Tel { get; set; } } class CallTask : IGsmTask { #region IGsmTask Members public string TaskID { get; set; } public string SessionID { get; set; } public string Tel { get; set; } #endregion } class SmsTask : IGsmTask { #region IGsmTask Members public string TaskID { get; set; } public string SessionID { get; set; } public string Tel { get; set; } #endregion public string SmsText { get; set; } } 

在这个设计中,我想向客户端托管CallTask​​,SmsTask和IGsmTask,以便在服务中使用这些,如下所示;

  [OperationContract] public void AddTask(IGsmTask task) { } 

我试图在IGsmTask上标记[DataContract] ,但它给了我complition错误。 是不是有任何methot我可以使用接口作为DataContracts? 或者我应该如何在此synerio中使用KnownAttributes类型?
谢谢。

据我所知,使用接口作为数据交换是不可能的。 您可以使用基类并在另一方面添加knowntype属性。

Fer:通过正确的设计,一切皆有可能。

如果问题是:

一个类是数据契约

&&

一个或多个属性必须是一个接口…

 public interface ICustomInterface { int Property1 {get;set} } [DataContract] public class MyClass { [DataMember(Name="_myInterface")] public ICustomInterface MyInterface {get;set;} } 

问题在于,当发生反序列化时 – 无法将数据转换为实现ICustomInterface的类。

解决方案是创建一个实现接口的具体类,并将公共属性的getter / setter(接口类型)强制转换为具体类的私有属性。

 public class CustomInterfaceImplementor: ICustomInterface { public int Property1 {get;set;} } [DataContract] public class MyClass { [DataMember(Name="_myInterface")] private CustomInterfaceImplementor _MyInterface; public ICustomInterface MyInterface { get {return (_MyInterface as ICustomInterface);} set {_MyInterface = (value as CustomInterfaceImplementor);} } }