匿名クラスは、その場で一時的に作成される名前の無いクラスです。匿名クラスは一時的な型のオブジェクトを作成したりするのに便利ですが、シリアライズとデシリアライズを利用した一般的なディープコピーの方法が使えません。
DeepCopy.Expression は匿名クラスのディープコピーにも対応しており、Expression Tree という機能を使って、オブジェクトの構造を解析し、新しいインスタンスとして複製出来ます。
対象のクラス
検証用に、以下の2種類の複製対象のクラスを用意しました。
public sealed class ClassA
{
public DateTime Date { get; set; }
public override string ToString() =>
Date.ToString();
}
public sealed class ClassB
{
public ClassB()
{
Datas = new List<int>();
}
public List<int> Datas { get; }
public override string ToString() =>
string.Join(",", Datas);
}
DeepCopy.Expression で匿名クラスの複製
ここでは、先ほどのオブジェクトを複数まとめて一度に複製させるという用途で匿名クラスを使用します。
複製の実行プログラムとしては以下のようにしました。
class Program
{
static void Main(string[] args)
{
var a = new ClassA()
{
Date = DateTime.Now
};
var b = new ClassB();
b.Datas.AddRange(new [] { 1, 2, 4, 8 });
var anonymous = new
{
A = a,
B = b
};
var cloned = ObjectCloner.Clone(anonymous);
Console.WriteLine($"A: Value = {cloned.A}, Reference = {anonymous.A == cloned.A}");
Console.WriteLine($"B: Value = {cloned.B}, Reference = {anonymous.B == cloned.B}");
}
}
ClassA のインスタンスと ClassB のインスタンスを anonymous にまとめてから anonymous を複製しています。
これを実行すると匿名クラスのインスタンスがディープコピーされ、そこに含まれるAとBも複製出来ていることが確認できます。
A: Value = 2021/04/17 13:54:07, Reference = False B: Value = 1,2,4,8, Reference = False
まとめ
あまり使用する機会は無いかもしれませんが、DeepCopy.Expression を使えば匿名クラスのオブジェクトもディープコピーすることが可能です。