Efter att lyckligt ovetandes levt med samma ICloneable-lösning en längre tid upptäckte jag nyligen att jag inte alls skapade den "djupa kopia" av mina objekt som (eng. deep copy) jag trott. I sökhistoriken till den söklösning vi bygger nu så ska sökfråge-objekt kopieras. Dessa har en del non-value-types som pekade mot samma objekt när man gjorde grunda kopior.
Efter lite sökande upptäckte jag att Microsoft avrått från ICloneable sedan 2003. Det var nog då jag började skriva i C#.
Den nya lösningen fick jag från Stackoweflow:
public static T DeepClone(T obj) { using (var ms = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(ms, obj); ms.Position = 0; return (T)formatter.Deserialize(ms); } }
I C# 3.0 kan man skapa en extension method och på så vis anropa funktionen direkt:
MyClass copy = obj.DeepClone();public static class ExtensionMethods{ // Deep clone public static T DeepClone(this T a) { using (MemoryStream stream = new MemoryStream()) {BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(stream, a);stream.Position = 0;return (T) formatter.Deserialize(stream);}}}
Källa: Stackoverflow