无法使用派生类实现属性

时间:2018-10-16 08:09:41

标签: c# inheritance serialization interface derived-class

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。

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

1 个答案:

答案 0 :(得分:0)

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

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;} }