クラスをコピーする場合、自前でコピーするメソッドを作成する必要があります
フィールドの追加などがあるとそのたびにコピー処理を直すのも面倒なので
Reflection を利用して DeepCopy する拡張メソッドを作成しました
サンプル
使い方は簡単でクラスのインスタンス.DeepCopy を 呼び出すだけです
Activator.CreateInstance
の都合上、コンストラクタに引数があるクラスはコピーできないので
利用する場合は注意してください
var t = new Test(); var t2 = t.DeepCopy(); t.Log(); // 10 1 t2.Log(); // 10 1 Console.WriteLine(t == t2); // false private class Test { private int V; private int V2; public Test() { V = 10; V2 = 1; } public void Log() { Console.WriteLine($"{V} {V2}"); } }
コード
using System; using System.Reflection; public static class ClassExtension { /// <summary> /// DeepCopy /// </summary> /// <param name="self"></param> /// <typeparam name="T"></typeparam> /// <returns></returns> public static T DeepCopy<T>(this T self) where T : class { var ret = Activator.CreateInstance(typeof(T), true) as T; var type = self.GetType(); var fields = type.GetFields(BindingFlags.Public | BindingFlags.NonPublic); foreach (var field in fields) field.SetValue(ret, field.GetValue(self)); return ret; } }