如何通过WCF传递List <Interface>?

Den*_*oli 5 wcf interface

我有一个WCF服务,我试图在我的一个操作合同中返回一个List(IWatchable是我建立的自定义界面).当我在客户端上测试服务时,该方法返回object[]而不是List<IWatchable>.是否可以返回IWatchable列表,因为IWatchable是与WCF的接口?

方法:

public List<IWatchable> GetWorkload( Guid nodeId, int maximum )
Run Code Online (Sandbox Code Playgroud)

IWatchable:

public interface IWatchable
{
    string ActionName { get; set; }
    Guid ActionReference { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

希望更多的信息将有所帮助......

我有一个派生界面:

public interface IAMRAWatchable: IWatchable
Run Code Online (Sandbox Code Playgroud)

以下三个具体实现IAMRAWatchable:

public class InstrumentationWatch: IAMRAWatchable
public class OutputWatch: IAMRAWatchable
etc...
Run Code Online (Sandbox Code Playgroud)

在我的WCF方法中返回List<IWatchable>我想发送一个InstrumentationWatch和一个OutputWatch到客户端...这是可能的还是我以错误的方式进行此操作?


解决

感谢John,我找到了解决方案.KnownType自从我使用以来我没有工作List<IWatchable>- 所以我将我的列表包装到一个新类中并添加了属性.我需要重新考虑我的代码,但对于其他感兴趣的人来说,这个类是:

[DataContract]
[KnownType( typeof( InstrumentationWatch ) )]
[KnownType( typeof( OutputWatch ) )]
public class WorkInfo
{
    [DataMember]
    public List<IWatchable> WorkQueue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和我的WCF方法:

public WorkInfo GetWorkload( Guid nodeId, int maximum )
Run Code Online (Sandbox Code Playgroud)

Joh*_*ers 9

接口永远不能被序列化.它只是对行为的描述.

您可以序列化实现该接口的对象,但您必须告诉WCF它们的类型是什么.请参见数据合同已知类型.