オブジェクトのディープ コピーを作成して、新しいコピーを変更し、変更をキャンセルして元のオブジェクトに戻すオプションが必要です。
ここでの問題は、オブジェクトが未知のアセンブリからであっても、任意の型になる可能性があることです。オブジェクトが不必要に [Serializable] 属性を持っているため、BinaryFormatter
orを使用できません。XmlSerializer
メソッドを使用してこれを実行しようとしましたObject.MemberwiseClone()
:
public object DeepCopy(object obj)
{
var memberwiseClone = typeof(object).GetMethod("MemberwiseClone", BindingFlags.Instance | BindingFlags.NonPublic);
var newCopy = memberwiseClone.Invoke(obj, new object[0]);
foreach (var field in newCopy.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
{
if (!field.FieldType.IsPrimitive && field.FieldType != typeof(string))
{
var fieldCopy = DeepCopy(field.GetValue(newCopy));
field.SetValue(newCopy, fieldCopy);
}
}
return newCopy;
}
これの問題は、列挙可能なもの (配列、リストなど) では機能せず、辞書では機能しないことです。
では、C# で不明なオブジェクトのディープ コピーを作成するにはどうすればよいでしょうか?
TNXたくさん!