C# 我的深度副本不是';我没有做真正的深度复制
我有一个类,我正试图运行一个深度复制。此类的一个成员是“MeshContainers”,它是MeshContainerCollection的一个实例 MeshContainerCollection继承自从列表继承的my SceneObjectCollection类 我注意到,源对象在meshcontainercollection中有1项,而克隆对象有0项。 在执行DeepCopy过程时,我注意到,当我尝试获取MeshContainerCollection的字段时,它找不到任何字段。 现在MeshContainerCollection没有任何直接字段(只有继承字段),所以我认为这就是问题所在 但我使用:C# 我的深度副本不是';我没有做真正的深度复制,c#,.net,C#,.net,我有一个类,我正试图运行一个深度复制。此类的一个成员是“MeshContainers”,它是MeshContainerCollection的一个实例 MeshContainerCollection继承自从列表继承的my SceneObjectCollection类 我注意到,源对象在meshcontainercollection中有1项,而克隆对象有0项。 在执行DeepCopy过程时,我注意到,当我尝试获取MeshContainerCollection的字段时,它找不到任何字段。 现在Mesh
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”实例运行。不确定这是否是原因。。。