うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【C#】クラスを DeepCopy する

クラスをコピーする場合、自前でコピーするメソッドを作成する必要があります

フィールドの追加などがあるとそのたびにコピー処理を直すのも面倒なので

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;
    }
}