【发布时间】:2012-06-19 20:36:29
【问题描述】:
我有一个班级,我正在尝试对其进行深拷贝。此类的成员之一是“MeshContainers”,它是 MeshContainerCollection 的一个实例。
MeshContainerCollection 继承自我的 SceneObjectCollection 类,该类继承自 List
我注意到源对象在 meshcontainercollection 中有 1 个项目,而克隆对象有 0 个项目。 在逐步执行 DeepCopy 过程时,我注意到当我尝试获取 MeshContainerCollection 的字段时,它没有找到任何字段。 现在 MeshContainerCollection 没有任何直接字段(只有继承的字段)所以我认为这是问题所在。
但我使用:
FieldInfo[] fields = type.GetFields(BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.Instance);
哪个(afaik)也应该返回私有继承成员。 我查看了现有的 BindingFlags,但无法确定是否还有另一个 BindingFlag 应该用于获取继承的私有字段。
有人能告诉我如何做一个真正的深拷贝吗?
我正在使用的深度复制方法:
private static object Process(object obj)
{
if (obj == null)
return null;
Type type = obj.GetType();
if (type.IsValueType || type == typeof(string))
{
return obj;
}
else if (type.IsArray)
{
Type elementType = Type.GetType(
type.FullName.Replace("[]", string.Empty));
var array = obj as Array;
Array copied = Array.CreateInstance(elementType, array.Length);
for (int i = 0; i < array.Length; i++)
{
copied.SetValue(Process(array.GetValue(i)), i);
}
return Convert.ChangeType(copied, obj.GetType());
}
else if (type.IsClass)
{
object toret = FormatterServices.GetUninitializedObject(obj.GetType());
FieldInfo[] fields = type.GetFields(BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo field in fields)
{
object fieldValue = field.GetValue(obj);
if (fieldValue == null)
continue;
field.SetValue(toret, Process(fieldValue));
}
return toret;
}
else
throw new ArgumentException("Unknown type");
}
EDIT1:我不喜欢通过序列化而是通过反射来做到这一点。
【问题讨论】:
-
最简单的deep copy implementation I've seen,它可能会对你有所帮助。 :)
-
@Trustme-I'maDoctor 虽然需要可序列化的类 :)
-
更新帖子,见帖子结尾
-
@romkyns 没错,但它简短而优雅:) 所以如果你只能在所有课程上使用
[Serializable],我肯定会使用这个解决方案。 -
@romkyns,我在帖子中想说的是字段是空的。