C# 我的深度副本不是';我没有做真正的深度复制

C# 我的深度副本不是';我没有做真正的深度复制,c#,.net,C#,.net,我有一个类,我正试图运行一个深度复制。此类的一个成员是“MeshContainers”,它是MeshContainerCollection的一个实例 MeshContainerCollection继承自从列表继承的my SceneObjectCollection类 我注意到,源对象在meshcontainercollection中有1项,而克隆对象有0项。 在执行DeepCopy过程时,我注意到,当我尝试获取MeshContainerCollection的字段时,它找不到任何字段。 现在Mesh

我有一个类,我正试图运行一个深度复制。此类的一个成员是“MeshContainers”,它是MeshContainerCollection的一个实例

MeshContainerCollection继承自从列表继承的my SceneObjectCollection类

我注意到,源对象在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");
}
私有静态对象进程(objectobj)
{
if(obj==null)
返回null;
Type Type=obj.GetType();
if(type.IsValueType | | type==typeof(string))
{
返回obj;
}
else if(键入.IsArray)
{
Type elementType=Type.GetType(
type.FullName.Replace(“[]”,string.Empty));
var数组=obj作为数组;
数组复制=Array.CreateInstance(elementType,Array.Length);
for(int i=0;i

EDIT1:我不喜欢通过序列化,而是通过反射来实现这一点。

实现这一点的方法之一是序列化对象,然后再反序列化回来。。编写一个函数来执行同样的操作。。 仅供参考,您的类需要为此标记为
[Serializable]

有些图书馆也有同样的功能。。是其中之一。。我建议不要尝试重新发明轮子,而是建立在这个库上,因为深度复制时有太多的边缘条件需要处理。。可能您也可以向作者提交修补程序。

如中所述

基类上的私有字段不会返回

请尝试以下方法:

public static IEnumerable<FieldInfo> GetAllFields(this Type type)
{
    IEnumerable<FieldInfo> fields = type.GetFields(
        BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);

    if (type.BaseType == null)
        return fields;
    else
        return GetAllFields(baseType).Concat(fields);
}
公共静态IEnumerable GetAllFields(此类型)
{
IEnumerable fields=type.GetFields(
BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
if(type.BaseType==null)
返回字段;
其他的
返回GetAllFields(baseType).Concat(fields);
}

(您可能想重写它以避免所有可枚举项和串联,但您明白了)

最简单的方法是,它可能会帮助您:@Trustme-I'maDoctor需要可序列化的类:)更新帖子,请参阅post@romkyns是的,但它又短又优雅:)所以如果你只能在所有类上使用
[Serializable]
,我肯定会使用这个解决方案。@romkyns,我在帖子中想说的是字段是空的。更新的帖子,谢谢,我试试看。我将在这里发布结果。这并没有解决我的问题。我必须更改对象初始值设定项以使用FormatterServices.GetUninitializedObject(obj.GetType());因为我没有一个无参数的构造函数,即使这样,它也返回了一个空的MeshContainerCollection。这给了我一个stackoverflow异常。我注意到它通过许多“Reflection.Pointer”实例运行。不确定这是否是原因。。。