Fer*_*Fer 14 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; }
}
Run Code Online (Sandbox Code Playgroud)
在这个设计中,我想向客户端托管CallTask,SmsTask和IGsmTask,以便在服务方面使用这些,如下所示;
[OperationContract]
public void AddTask(IGsmTask task)
{
}
Run Code Online (Sandbox Code Playgroud)
我试图在IGsmTask上标记[DataContract], 但它给了我complition错误.我有没有可以使用接口作为DataContracts的methot?或者我应该如何在此synerio中使用KnownAttributes类型?
谢谢.
小智 10
Fer:通过正确的设计,一切皆有可能.
如果问题是:
一个类是数据契约
&&
1个或多个属性必须是接口...
public interface ICustomInterface
{
int Property1 {get;set}
}
[DataContract]
public class MyClass
{
[DataMember(Name="_myInterface")]
public ICustomInterface MyInterface {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
问题是当反序列化发生时 - 无法将数据转换为实现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);}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18172 次 |
| 最近记录: |