如何在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错误。 是不是有任何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);} } }