【问题标题】:Cannot implement property using derived class无法使用派生类实现属性
【发布时间】:2019-03-20 17:01:44
【问题描述】:
public interface IBase
{
    int Id { get; set; }
}

public interface IDerivedA : IBase
{
    int Name { get; set; }
    int Quantity { get; set; }
}

public interface IDerivedB : IBase
{
    string Name { get; set; }
    IEnumerable<IDerivedA> DerivedBs { get; set; }
}

这是一个将被序列化的类的实现,但是当我尝试使用 DerivedASerialize 类时出现编译错误,该类是 IDerivedA的派生类> 界面

[MessagePack.Union(0, typeof(DerivedASerialize))]
[MessagePack.Union(1, typeof(DerivedBSerialize))]
[MessagePack.MessagePackObject(true)]
public class BaseSerialize : IBase
{
    public int Id { get; set; }
    public bool IsNull { get;set; }
}

[MessagePack.MessagePackObject(true)]
public class DerivedASerialize : BaseSerialize, IDerivedA
{
    public int Name { get; set; }
    public int Quantity { get; set; }
}

[MessagePack.MessagePackObject(true)]
public class DerivedBSerialize : BaseSerialize, IDerivedB
{
    public string Name { get; set; }
    public IEnumerable<DerivedASerialize> DerivedBs { get; set; }
}

有什么解决办法吗?因为我只能序列化类。

我想要另一个类,它也派生自同一个接口并具有不同的属性

使用 neuec 的 MessagePack。

编辑:向类添加序列化逻辑。

【问题讨论】:

  • 属性“DeriveddBs”无法实现接口“IDerivedB”的属性。类型应为“IDerivedA”
  • 你是如何序列化课程的?也向我们展示该代码
  • 查看更新@bashrc

标签: c# inheritance serialization interface derived-class


【解决方案1】:

如果您需要两个不同的“名称”字段,您可以使用显式接口实现:

public class DerivedBSerialize : BaseSerialize, IDerivedB
{
    public string Name { get; set; }
    public IEnumerable<DerivedASerialize> DerivedBs { get; set; }
    string IDerivedB.Name { get; set; }
    IEnumerable<IDerivedA> IDerivedB.DerivedBs { get; set; }
}

如果您只需要一个“名称”字段 - 您可以将其提升为“IBase”,或创建另一个接口 -

interface INameable { string Name {get; set;} }

【讨论】:

  • 我已经尝试过了,但是当我序列化类时,我会得到一个异常,因为我无法序列化接口,我可以将它添加一个忽略属性,但是如果有更多类,它会变得杂乱无章..
  • 我已经编辑了我的答案 - 我认为添加另外一两个接口可能会解决您的问题,如果有帮助请告诉我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 2020-03-28
  • 1970-01-01
  • 2014-03-13
相关资源
最近更新 更多