用子类复制类/对象递归

本文关键字:对象 递归 子类 复制 | 更新日期: 2023-09-27 17:54:49

我有一个类。我对这个类没有影响,它来自其他地方,来自第三方。

我有自己的班级。当我更新它是一样的。但以后可能会丢失对象。

我需要复制类let在这里叫它"source"到我的类"target"。

source有struct、int和string类型的列表。

首先,我试图在没有引用的情况下得到它,它看起来很有效,但由于缺少引用,目标在那之后是空的。

(如果有人想看代码,请告诉我)。

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

遍历类是可行的。请帮帮我,我需要一个紧急的解决方案。并且请将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); 
// } 
// } 
// } 
// } 
//} 
} 
} 
} 
}

我想问题是从注释开始的地方开始的。我在那部分得到了一个结构体或列表,它包含字符串或整型…

非常感谢!

快速回复

用子类复制类/对象递归

获得可序列化对象的深度副本的最简单方法是将其序列化到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 
{
     ...
}
<<p> Non-serializable类/strong>

有一些解决方案使用反射来获得深度拷贝(如CodeProject: c#中对象的深度拷贝),尽管测试它们是否正确处理循环引用很重要。如果您的对象不引用自己(直接或间接),您可以尝试这种方法。