Я бы добавил метод к каждой модели, которую нужно клонировать таким образом, я бы также рекомендовал интерфейс для него.
Это можно сделать примерно так:
//Company.cs
Company DeepClone()
{
Company clone = new Company();
clone.Name = this.name;
//...more properties (be careful when copying reference types)
clone.Locations = new List<Location>(this.Locations.Select(l => l.DeepClone()));
return clone;
}
Вы должны повторить этот базовый шаблон для каждого класса и «дочернего» класса, который должен быть копируемым. Таким образом, каждый объект знает, как создать глубокий клон самого себя, и передает ответственность за дочерние объекты дочернему классу, аккуратно инкапсулируя все.
Его можно было бы использовать так:
Company copyOfCompany123 = DbContext.Companies.Find(123).DeepClone;
Мои извинения, если в приведенном выше коде есть какие-либо ошибки; У меня сейчас нет Visual Studio, чтобы все проверить, я работаю по памяти.
Еще один действительно простой и эффективный способ глубокого клонирования объекта с помощью сериализации можно найти в этом сообщении Как выполнить глубокое копирование объекта в .Net (в частности, в C#)?
public static T DeepClone<T>(T obj)
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, obj);
ms.Position = 0;
return (T) formatter.Deserialize(ms);
}
}
Просто имейте в виду, что это может иметь довольно серьезные проблемы с ресурсами и производительностью в зависимости от структуры вашего объекта. Каждый класс, в котором вы хотите его использовать, также должен быть помечен атрибутом [Serializable]
.
person
Bradley Uffner
schedule
27.04.2016