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

时间:2012-04-02 08:00:23

标签: c# wcf datacontract


我有两个数据类,只保存数据成员(没有函数)。一个是 CallTask​​ ,另一个是 SmsTask 。这两个类有一些常见的属性,如 ID Tel 。我将这些常见属性放在一个单独的接口类中,并在适当的时候在我的项目中使用此接口类。
现在我在我的项目中添加了一个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错误。我有没有可以使用接口作为DataContracts的methot?或者我应该如何在此synerio中使用KnownAttributes类型? 感谢。

2 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:9)

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);}
     }
}