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

本文关键字:接口 记为 DataContract WCF | 更新日期: 2023-09-27 18:29:39


我有两个数据类,它们只包含数据成员(没有函数)。一个是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],但它给了我编译错误。是否有任何方法可以将接口用作DataContracts?或者我应该如何在这个synerio中使用KnownAttributes类型
谢谢

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

据我所知,将接口用作数据合约是不可能的。另一方面,您可以使用基类并添加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);}
     }
}