我上课了。我对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 ...
非常感谢!
快速回复
答案 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#),尽管测试它们是否正确处理循环引用很重要。如果您的对象没有引用(直接或间接),您可以尝试这种方法。