首页 文章

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

提问于
浏览
13

我有两个数据类,只保存数据成员(没有函数) . 一个是 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错误 . 我有没有可以使用接口作为DataContracts的methot?或者我应该如何在此synerio中使用KnownAttributes类型?
谢谢 .

2 回答

  • 8

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

  • 13

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

    如果问题是:

    一个类是数据 Contract

    &&

    1个或多个属性必须是接口...

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

    问题是当反序列化发生时 - 无法将数据转换为实现ICustomInterface的类 .

    解决方案是创建一个实现接口的具体类,并将公共属性(类型为interface)的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);}
         }
    }
    

相关问题