使用不同名称空间的WCF契约和多态性:给出了什么?

本文关键字:多态性 什么 契约 WCF 空间 | 更新日期: 2023-09-27 18:10:14

如何在这样的场景中执行多态性:

如果我在命名空间Foo中有一个类Dachshund,它继承自命名空间Bar中的类Dog:

namespace Bar
{
  public class Dog
  {
    public string Color { get; set; }
    public string Bark { get; set; }
  }
}
namespace Foo
{
  public class Dachshund : Dog
  {
    public int Length { get; set; }
  }
}

和我用腊肠狗做一些狗的事情,但通过wcf作为一只狗,发生了什么?一些序列化问题:

[ServiceBehavior]
public class myWcfService : ImyWcfService
{
  [OperationBehavior]
  public Message GetDog()
  {
    var myDach = new Dachshund();
    // do some stuff with my dach
    return new Message { Dog = myDach as Dog, Message = "I'm sending a dog" };
  }
}
public class Message
{
  public Dog Dog { get; set; }
  public string Message { get; set; }
}

使用不同名称空间的WCF契约和多态性:给出了什么?

您需要将[ServiceKnownType]属性添加到您的服务契约(定义服务操作的接口,而不是服务实现(实际类):

[ServiceContract]
[ServiceKnownType(typeof(Dachshund))]  // <- Add this attribute
public interface ImyWcfService
{
   //...
}

这将足以让DataContractSerializer"知道"您的类,并能够正确地序列化/反序列化它。