【发布时间】:2014-01-08 11:26:29
【问题描述】:
我正在尝试实现深度克隆功能并且已经问了一些问题:
- IsPrimitive doesn't include nullable primitive values
- Array, List, IEnumerable, CustomList class cast to one and iterate threw them
- https://stackoverflow.com/questions/20978951
我正在修改以下代码: https://stackoverflow.com/a/11308879/2598770
目前我面临的问题是,我的原始列表也被“复制”对象修改,而不仅仅是克隆对象,正如前面第二个问题 (Array, List, IEnumerable, CustomList class cast to one and iterate threw them) 所建议的那样。我已更改以下代码:
//Code directly from source
var cloneObject = CloneMethod.Invoke(originalObject, null);
if (typeToReflect.IsArray)
{
var arrayType = typeToReflect.GetElementType();
if (IsPrimitive(arrayType) == false)
{
Array clonedArray = (Array)cloneObject;
clonedArray.ForEach((array, indices) => array.SetValue(InternalCopy(clonedArray.GetValue(indices), visited), indices));
}
}
对于同时处理 IList 而不仅仅是数组的版本:
var cloneObject = CloneMethod.Invoke(originalObject, null);
if (cloneObject is IList)
{
if (typeToReflect.GetGenericArguments().Any())
{
var arrayType = typeToReflect.GenericTypeArguments[0];
if (IsPrimitive(arrayType) == false)
{
var clonedArray = (IList)cloneObject;
if (clonedArray.IsReadOnly == false)
for (var i = 0; i < clonedArray.Count; i++)
{
var originalListEntry = clonedArray[i];
var clonedListEntry = InternalCopy(originalListEntry, visited);
clonedArray[i] = clonedListEntry;
}
}
}
}
但是在clonedArray[i] = clonedListEntry;这一行,它不仅改变了clonedArray,还改变了originalObject。
我怎样才能防止这种情况,让 clonedListEntry 只在 clonedArray 上设置?
【问题讨论】:
-
您是否正在重新发明另一个自动映射器?
-
@Dennis 不要这么想,我只是想要一个我的对象的简单副本而已。