代码之家  ›  专栏  ›  技术社区  ›  stiank81

将WCF与抽象类一起使用

  •  21
  • stiank81  · 技术社区  · 14 年前

    如何为WCF中的抽象类定义DataContract?

    我有一个类“人”,我使用wcf成功地沟通。现在我添加了一个新的类“foo”,引用自person。都还不错。但是当我将foo抽象化并定义一个子类时,它失败了。它在服务器端失败,出现了一个通信异常,但这并不能说明什么。

    我简化的测试课程:

    [DataContract]
    public class Person
    {
        public Person()
        {
            SomeFoo = new Bar { Id = 7, BaseText = "base", SubText = "sub" };
        }
    
        [DataMember]
        public int Id { get; set; }
    
        [DataMember]
        public Foo SomeFoo { get; set; }
    }
    
    [DataContract]
    public abstract class Foo
    {
        [DataMember]
        public int Id { get; set; }
    
        [DataMember]
        public string BaseText { get; set; }
    }
    
    [DataContract]
    public class Bar : Foo
    {
        [DataMember]
        public string SubText { get; set; }
    }
    
    2 回复  |  直到 10 年前
        1
  •  32
  •   stiank81    14 年前

    我知道了。您需要使用“knowntype”在抽象基类上指定子类。解决方案是在foo类中添加这个:

    [DataContract]
    [KnownType(typeof(Bar))] // <------ added
    public abstract class Foo
    {
        [DataMember]
        public int Id { get; set; }
    
        [DataMember]
        public string BaseText { get; set; }
    }
    

    退房 this link .

        2
  •  2
  •   Justin Niessner    14 年前

    有趣。

    我希望代码在 Person 构造函数,因为不能直接实例化抽象类。