我可以在WCF客户端代码中使用接口作为类型吗?

我可以在WCF客户端代码中使用接口作为类型吗?,wcf,windows-phone-7,Wcf,Windows Phone 7,我正在开发一个Windows Phone 7应用程序,使用WCF与我的服务器进行通信 我已经创建了一个服务,并且能够很好地进行通信,但是在访问客户端代码中的接口时遇到了问题 例如,在我的服务器代码中有如下内容: [OperationContract] [ServiceKnownType(typeof(IField))] [ServiceKnownType(typeof(TextField))] [ServiceKnownType(typeof(NumberField))] FieldForm G

我正在开发一个Windows Phone 7应用程序,使用WCF与我的服务器进行通信

我已经创建了一个服务,并且能够很好地进行通信,但是在访问客户端代码中的接口时遇到了问题

例如,在我的服务器代码中有如下内容:

[OperationContract]
[ServiceKnownType(typeof(IField))]
[ServiceKnownType(typeof(TextField))]
[ServiceKnownType(typeof(NumberField))]
FieldForm GetForm();
现在,我的FieldForm包含以下声明:

[DataContract]
class FieldForm
{
   public List<IField> Fields { get; set; }
}
(这不是我的代码,但描述了我试图实现的目标)

现在在我的客户机上,我通过WCF接收一个FieldForm对象,并希望遍历Fields列表以确定要创建的UI元素。问题是,该服务没有在客户机上提供IField接口,但我有可用的实现(TextField和NumberField)

这导致我的客户机代码中出现一些糟糕的代码,如:

foreach ( object field in Fields )
{
   if ( field is TextField )
      // do textfieldy stuff
   else if (field is NumberField)
      // do numberfieldy stuff
}
当我真的更喜欢只使用:

foreach ( IField field in Fields )
{
   field.Name;
}
为了使接口类型在客户机上可用,我是否在接口上缺少一个简单的注释,或者WCF只是不提供序列化接口的功能


是否有一种方法可以在客户端代码中访问接口?

否您无法通过WCF连接序列化接口

WCF使用序列化(XML)消息在客户机和服务器之间进行通信—您可以在XML模式(XSD)中表达的所有内容都可以在客户端和服务器之间移动。这基本上意味着任何具体类型,由int、string等原子类型组成。。XSD还支持继承和枚举,但这已经是旗杆的终点了


如果您控制通信链路的两端(例如服务器和客户端),您可能会做的是将这些接口(服务接口以及数据契约和接口)放入一个公共的共享程序集中,然后客户端项目和服务器项目都将引用该程序集。在具体的服务实现中使用实现接口的任何类,但是通过此程序集共享,您可以在客户端使用您喜欢的签名,并针对接口编写程序。请注意:这“扼杀”了WCF服务的所有互操作性-Ruby或Java客户端将无法再调用您的服务。

谢谢!我真的很喜欢共享组装的想法,尽管这对于这个特定的项目来说太过分了。不过,我肯定会记住未来的战略。
foreach ( IField field in Fields )
{
   field.Name;
}