使用子类复制类/对象递归

时间:2011-05-05 13:14:21

标签: c# recursion copy

我上课了。我对thios课程没有任何影响,它来自其他地方,来自第三方。

我有自己的课。当我更新它是相同的。但它可能会在以后丢失对象。

我需要复制Class让我们在这里调用“source”到我的班级“target”。

source包含结构,包含整数和字符串的列表。

首先,我试图在没有参考的情况下通过它,它看起来像是有效的,但是之后目标是空的,因为缺少参考。

(如果有人想看到该代码让我知道)。

现在我做了第二次尝试:我不确定它是否是正确的方法,我在将值复制到目标中的正确位置时遇到问题,

逐步完成课程。请帮帮我,我需要一个紧急的解决方案。请将Class现有源复制到现有目标(如果项目存在于同一结构中),

请不要对它完全不同的建议,因为我对类源和类目标本身没有影响,我只需要复制值和子类。

到目前为止我的代码。通过类和子类工作,在设置值(到正确的位置)时遇到问题:

void refcopyObject(ref object source,ref object target,object svalue,object tvalue) 
{ 
if (source != null && target != null) 
{ 
if (source.GetType() == (typeof(string))) 
{ 
target = source; 
} 
else 
if (source.GetType() == (typeof(int))) 
{ 
target = source; 
} 
else 
if (source.GetType() == (typeof(IntPtr))) 
{ 
target = source; 
} 
else 
{ 
FieldInfo[] fifsource = source.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public); // | BindingFlags.NonPublic 
FieldInfo[] fiftarget = target.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public); // | BindingFlags.NonPublic 
if (fifsource.Length > 0) 
{ 
for (int i = 0; i < fifsource.Length; i++) 
{ 
if (fifsource.GetType() == fiftarget.GetType()) 
{ 
if (i < fiftarget.Length) 
{ 
object psource = source.GetType().GetFields(); 
object ptarget = target.GetType().GetFields(); 
object vsource = source.GetType().GetFields().GetValue(source); 
object vtarget = target.GetType().GetFields().GetValue(target); 
refcopyObject(ref psource, ref ptarget, vsource, vtarget); 
} 
} 
} 
} 
else 
{ 
//Unten angekommen 
copySubObject(ref source, ref target, svalue, tvalue); 
////So gehts nicht, dann wird die Referenz wieder verloren 
//FieldInfo[] fifs = svalue.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public); // | BindingFlags.NonPublic 
//if (fifs.Length > 0) 
//{ 
// FieldInfo[] fift = tvalue.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public); // | BindingFlags.NonPublic 
// for (int i = 0; i < fifs.Length; i++) 
// { 
// if (fifs.GetType() == fift.GetType()) 
// { 
// if (i < fift.Length) 
// { 
// object psource = svalue.GetType().GetFields().GetValue(svalue); 
// object ptarget = tvalue.GetType().GetFields().GetValue(tvalue); 
// if (ptarget == null) 
// { 
// //Ganz unten angekommen, Problem bei Listen 
// if (psource.GetType() == (typeof(string))) 
// { 
// tvalue.GetType().GetFields().SetValue(tvalue,psource); 
// } 
// if (psource.GetType() == (typeof(int))) 
// { 
// tvalue.GetType().GetFields().SetValue(tvalue, psource); 
// } 
// } 
// else 
// { 
// refcopyObject(ref psource, ref ptarget, null, null); 
// } 
// } 
// } 
// } 
//} 
} 
} 
} 
}

我猜问题从评论开始的地方开始。我得到了那个部分的结构或列表,其中包含字符串或int ...

非常感谢!

快速回复

1 个答案:

答案 0 :(得分:1)

嗯,获取可序列化对象的深层副本的最简单方法是将其序列化为MemoryStream,然后将其反序列化为新对象:

public static T DeepCopy<T>(T other)
{
   using (MemoryStream ms = new MemoryStream())
   {
       BinaryFormatter formatter = new BinaryFormatter();
       formatter.Serialize(ms, other);
       ms.Position = 0;
       return (T)formatter.Deserialize(ms);
   }
}

请注意,这需要使用[Serializable]属性标记您的源类型,并且由于您无权访问该代码,因此它不依赖于您:

[Serializable]
public class MyClass 
{
     ...
}

非序列化类

有些解决方案使用Reflection来获取深层副本(如CodeProject: Deep copy of objects in C#),尽管测试它们是否正确处理循环引用很重要。如果您的对象没有引用(直接或间接),您可以尝试这种方法。