Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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#_Class_Deep Copy - Fatal编程技术网

C# 我想把一个班上的所有东西都复制到另一个班上

C# 我想把一个班上的所有东西都复制到另一个班上,c#,class,deep-copy,C#,Class,Deep Copy,我发现了许多与我的问题类似的解决方案。 但它们对我来说并不完美。 这是我想做的。 *修改:我不会使用反射。非常慢。。所以我正在尝试另一种方法来解决这个问题 [System.Serializable] class myBase { public int a; public int nType; // Actually lots of fields and properties are here. } [System.Serializable] class TypeA : myBa

我发现了许多与我的问题类似的解决方案。 但它们对我来说并不完美。 这是我想做的。 *修改:我不会使用反射。非常慢。。所以我正在尝试另一种方法来解决这个问题

[System.Serializable]
class myBase
{
   public int a;
   public int nType;
   // Actually lots of fields and properties are here.
}
[System.Serializable]
class TypeA : myBase
{
   public int c;
}
[System.Serializable]
class TypeB : myBase
{
   public int d;
}
这就是我要尝试的

class test
{
   public void test()
   {
          myBase cBase = new myBase();
          cBase.a = 100;
          cBase.nType = 0;
          if(cBase.nType == 0)
          {
             TypeA newThing = new TypeA();
             // I want to assign cBase to newThing.
             newThing = cBase as TypeA; <= it is not proper:( will return null.
          }         
          else 
          {
             TypeB newThing = new TypeB();
             newThing = test.DeepClone<myBase>(cBase); // it's also not proper XD.
          }     

          public static T DeepClone<T>(T obj)
          {
              using (MemoryStream ms = new MemoryStream())
              {
                  BinaryFormatter formatter = new BinaryFormatter();
                  formatter.Serialize(ms, obj);
                  ms.Position = 0;

                  return (T) formatter.Deserialize(ms);
              }
          }
}
类测试
{
公开无效测试()
{
myBase cBase=新的myBase();
cBase.a=100;
cBase.nType=0;
如果(cBase.nType==0)
{
TypeA newThing=新TypeA();
//我想把cBase分配给newThing。

newThing=cBase as TypeA;为此,您可以使用库自动映射

但若你们想实现你们自己的,你们可以使用反射来迭代属性并在目的地设置它们

进行此操作时,您应该记住反射速度很慢,因此,一旦获得源和目标对象的属性,您可能应该将其缓存以备将来使用

这篇文章展示了如何使用“动态”类型来实现这一目的。它声称性能要好得多

您可以为此使用库自动映射

但若你们想实现你们自己的,你们可以使用反射来迭代属性并在目的地设置它们

进行此操作时,您应该记住反射速度很慢,因此,一旦获得源和目标对象的属性,您可能应该将其缓存以备将来使用

这篇文章展示了如何使用“动态”类型来实现这一目的。它声称性能要好得多

它不是
cBase as TypeA()
,而是
cBase as TypeA
。您介意提供现有解决方案“不适合您”的标准吗?您展示的示例是深度克隆的标准方法之一(使用带反射的序列化作为实现细节)所以不太清楚,如果它是你认为不好的方法的样本,你认为是新的方法或者别的什么。它不是<代码> cBASE作为类型()/代码>,它是<代码> cBASE作为TypeA < /代码>。你介意提供为什么现有解决方案“不适合你”的标准吗?你所展示的样本是深度克隆的标准方法之一。(使用反射作为实现细节的序列化)-所以不清楚是否是你考虑坏方法的示例,你认为是新方法或其他东西。它不是<代码> cBaseType()/代码>,它是<代码> Cbaseas TypeA < /Cord>。你介意提供为什么现有解决方案“不适合你”的标准吗??您展示的示例是深度克隆的标准方法之一(使用带有反射的序列化作为实现细节)所以不清楚是否是你考虑的坏方法的样本,你认为是新的方法或者别的什么东西。我想把它自己实现,而不使用反射。我用反射来实现它,它工作得很好。但是很慢。这就是为什么我需要另一种方法来做它。如果你经常复制同一个对象,我想自己实现它,不会使用反射。我用反射实现它,效果很好。但速度很慢。这就是为什么我需要另一种方法来实现它。如果你经常复制同一个对象,缓存反射会有很大的不同。我想自己实现它,不会影响我们反射。我用反射来实现它,效果很好。但是速度很慢。这就是为什么我需要另一种方法来实现它。如果你经常复制相同的对象,缓存反射会有很大的不同