Невозможно реализовать свойство, используя производный класс - PullRequest
0 голосов
/ 16 октября 2018
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; }
}

Есть ли обходной путь?поскольку я могу только сериализовать классы.

И я хотел бы иметь другой класс, который также является производным от того же интерфейса и имеет другие свойства

Использование MessagePack neuec.

Редактировать:Добавьте логику сериализации в классы.

1 Ответ

0 голосов
/ 16 октября 2018

Если вам требуются два разных поля «Имя», вы можете использовать явную реализацию интерфейса:

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