C# Клонирование переменой интерфейса

У меня есть небольшое MVVM приложение. Мне необходимо клонировать ViewModel, чтобы изменения одного не меняло клон этой ViewModel.

MainViewModel

public void AddHistory(IPageViewModel value)
{
    IPageViewModel clon = (IPageViewModel)value;
    ...
}

IPageViewModel

public interface IPageViewModel
{
    string Title { get; set; }
    string Text { get; set; }
    string id { get; set; }
}

Я пытался в MainViewModel добавить интерфейс ICloneable и его реализовать

public void AddHistory(IPageViewModel value)
{
    IPageViewModel clon = (IPageViewModel)value.Clone();
    ...
}

public object Clone()
{
     return MemberwiseClone();
}

Но это привело к ошибке:

"IPageViewModel" не содержит определения "Clone", и не удалось найти доступный метод расширения "Clone", принимающий тип "IPageViewModel" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)

Реализовать интерфейс ICloneable в IPageViewModel не удалось.

Как правильно клонировать ViewModel?


Ответы (1 шт):

Автор решения: Melkor V

Если не хочется ручками писать метод "Клона" данных, можно использовать Json сериализацию и десериализацию. Дженерик метод ниже можно легко использовать.

public static T Clone<T>(T source)
{
    var serialized = JsonConvert.SerializeObject(source);
    return JsonConvert.DeserializeObject<T>(serialized);
}
→ Ссылка