Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用子类递归复制类/对象_C#_Recursion_Copy - Fatal编程技术网

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

C# 使用子类递归复制类/对象,c#,recursion,copy,C#,Recursion,Copy,我有课。我对thios类没有影响,它来自其他地方,来自第三方 我有自己的课。当我更新时,它是相同的。但它以后可能会丢失对象 我需要复制类,让我们在这里调用它“源”到我的类“目标” 源具有结构、包含整数和字符串的列表 首先,我试图在没有引用的情况下通过它,它看起来像是工作了,但由于缺少引用,目标之后是空的 (如果有人想查看该代码,请告诉我) 现在我做了第二次尝试:我不确定这是否是正确的方法,我在将值复制到目标中的正确位置时遇到问题 在课堂上循序渐进。请帮帮我,我需要一个紧急的解决方案。请将类现有源

我有课。我对thios类没有影响,它来自其他地方,来自第三方

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

我需要复制类,让我们在这里调用它“源”到我的类“目标”

源具有结构、包含整数和字符串的列表

首先,我试图在没有引用的情况下通过它,它看起来像是工作了,但由于缺少引用,目标之后是空的

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

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

在课堂上循序渐进。请帮帮我,我需要一个紧急的解决方案。请将类现有源复制到现有目标(如果项存在于同一结构中)

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

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

void refcopyObject(ref对象源、ref对象目标、对象svalue、对象tvalue)
{ 
if(源!=null&&target!=null)
{ 
if(source.GetType()==(typeof(string)))
{ 
目标=源;
} 
其他的
if(source.GetType()==(typeof(int)))
{ 
目标=源;
} 
其他的
if(source.GetType()==(typeof(IntPtr)))
{ 
目标=源;
} 
其他的
{ 
FieldInfo[]fifsource=source.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public);/| BindingFlags.NonPublic
FieldInfo[]fiftarget=target.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public);/| BindingFlags.NonPublic
如果(fifsource.Length>0)
{ 
for(int i=0;i0)
//{ 
//FieldInfo[]fift=tvalue.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public);/| BindingFlags.NonPublic
//对于(int i=0;i
我想问题是从评论开始的。我在那个部分找到了一个结构或列表,其中包含字符串或int

非常感谢


快速回复

获取可序列化对象的深度副本的最简单方法是将其序列化到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);
   }
}
不可序列化类


有一些解决方案使用反射来获取深度副本(如),尽管测试它们是否正确处理循环引用很重要。如果对象不引用自身(直接或间接),您可以尝试这种方法。

您不需要所有这些
ref
s。您确实需要一些空格。类似的问题:就像我说的,我对源类没有影响。我确实有一个现有的类源和一个现有的类目标。我需要把我找到的所有东西从源复制到目标。我无法使用克隆等操作或更改其中一个类本身…@user739611:请从中尝试深度复制方法。如果对象图中没有循环引用,它应该可以工作。您好,问题是:这总是会创建一个新对象。它像克隆一样创建子类等。当我在源代码中有一个子类但在目标代码中没有时,它会添加这个子类。如果我删除这些添加,它将无法再处理这些设置值,因为类将不再匹配(我的类具有相同的结构和名称,但名称空间不同)…@user739611:在这种情况下,您可以尝试。它是一个用于自定义对象到对象映射的库,按照约定(根据需要进行少量配置)可以完成大量工作。
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]
public class MyClass 
{
     ...
}