C#で自作したクラスのListを複製(値コピー/DeepCopy)する方法でネット検索すると、ToList()したり、newしたりする方法が出て来ますが、DeepCopy()メソッドを作るのが無難です。
DeepCopy()メソッドのサンプルとしては、これが一番イケてました。
https://tomisenblog.com/c-sharp-deepcopy/
1. CopyHelperクラスを追加。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
using System.IO; using System.Runtime.Serialization.Formatters.Binary; namespace Common { public static class CopyHelper { /// <summary> /// DeepCopy /// </summary> public static T DeepCopy<T>(this T src) { using(var stream = new MemoryStream()) { var formatter = new BinaryFormatter(); formatter.Serialize(stream,src); stream.Position = 0; return(T) formatter.Deserialize(stream); } } } } |
2. DeepCopyするクラスに[Serializable]を追加。
1 2 3 4 5 6 7 |
[Serializable] // ← DeepCopy用 public class SuperParent { public int X1 { get; set; } } |
3. 変数の拡張メソッドでDeepCopy()を実行。
1 2 3 |
var superParentListClone = superParentList.DeepCopy(); |
※[SYSLIB0011 ‘BinaryFormatter.Deserialize(Stream)’ ‘BinaryFormatter.Serialize(Stream, object)’ は旧形式です (‘BinaryFormatter serialization is obsolete and should not be used. See https://aka.ms/binaryformatter for more information.’)]警告を解消したDeepCopyはこちら
コメント