Я видел несколько разных подходов к этому, но я использую универсальный служебный метод как таковой:
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]
для этого для работы. Ваш исходный файл должен включать следующий код:
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
Основываясь на решении Килхоффера ...
С C # 3.0 вы можете создать метод расширения следующим образом:
public static class ExtensionMethods
{
// Deep clone
public static T DeepClone<T>(this T a)
{
using (MemoryStream stream = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(stream, a);
stream.Position = 0;
return (T) formatter.Deserialize(stream);
}
}
}
, который расширяет любой класс, помеченный как [Serializable], с помощью метода DeepClone
MyClass copy = obj.DeepClone();