I have a class which I'm trying to run a deep copy on. One of the members of this class is 'MeshContainers' which is an instance of MeshContainerCollection.
MeshContainerCollection<> inherits from my SceneObjectCollection<> class which inherits from List<>
What I noticed is that the source object has 1 item inside the meshcontainercollection while the cloned object has 0. When stepping through the DeepCopy process I noticed that when I try to get the fields for MeshContainerCollection, it doesn't find any. Now MeshContainerCollection doens't have any direct fields (only inherited fields) so I thought that was the problem.
But I use:
FieldInfo[] fields = type.GetFields(BindingFlags.Public |
        BindingFlags.NonPublic | BindingFlags.Instance);
Which (afaik) should also return the private inherited members. I have looked through the existing BindingFlags but haven't been able to figure out if there is another BindingFlag I should use to get the inherited private fields.
Could someone tell me how I can manage to do a REAL deep copy?
Deep Copy method I'm using:
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: I prefer not to do this by serialization but by reflection.
 
     
    