C# 将一个类复制到另一个类?

C# 将一个类复制到另一个类?,c#,.net,class,copy,C#,.net,Class,Copy,我有 如何将A复制到另一个A?在C++中,我知道我可以做 *a1**2;。C#中有类似的东西吗?我知道我可以使用反射编写一个通用的解决方案,但我希望已经存在一些东西 我正在考虑将A更改为可为空的结构 第二步我需要做 class A { public int a; public string b; } 然后将基础数据从B复制到C。假设A只是一个简单的类,您可以这样做 class B : A {} class C : A {} MemberwiseClone()是一个浅拷贝,因此

我有

如何将A复制到另一个A?在C++中,我知道我可以做<代码> *a1**2;<代码>。C#中有类似的东西吗?我知道我可以使用反射编写一个通用的解决方案,但我希望已经存在一些东西

我正在考虑将A更改为可为空的结构

第二步我需要做

class A
{
    public int a;
    public string b;
}

然后将基础数据从B复制到C。

假设A只是一个简单的类,您可以这样做

class B : A {}
class C : A {}

MemberwiseClone()是一个浅拷贝,因此如果您的类变得复杂,并且属性也是引用类型,那么这将不适用于您。

iclonable
接口,它提供了
Clone()
方法


您可以克隆,也可以定义复制构造函数。为什么要把类变成结构,因为C++中你可以用10个字符来做一些事情。C#是不同的。结构有优点也有缺点。

添加适当的构造函数:

A newA = instanceOfA.MemberwiseClone();
<>你也应该考虑使它不可变,特别是当你考虑把它变成一个结构的时候。可变结构是邪恶的


最后,当您从类继承时,不需要将成员从基类复制到子类。

我使用了二进制序列化。基本上,将实例序列化为内存流。然后,将其从内存流中反序列化。您将拥有一份精确的二进制副本。这将是一个深度拷贝,而不是浅拷贝

class Foo
{
    public Foo(int a, string b)
    {
        A = a;
        B = b;
    }

    public Foo(Foo other)
    {
        A = other.A;
        B = other.B;
    }

    public int A { get; set; }
    public string B { get; set; }
}

对于浅层复制,您可以使用Object.MemberwiseClone

以下是一些人已经做过的事情


这里有一些简单的代码,可用于任何类,而不仅仅是基类

class a = new ClassA();

class b = MySerializationMethod(a);

我们已成功使用此代码:

    public static void DuckCopyShallow(this Object dst, object src)
    {
        var srcT = src.GetType();
        var dstT= dst.GetType();
        foreach(var f in srcT.GetFields())
        {
            var dstF = dstT.GetField(f.Name);
            if (dstF == null || dstF.IsLiteral)
                continue;
            dstF.SetValue(dst, f.GetValue(src));
        }

        foreach (var f in srcT.GetProperties())
        {
            var dstF = dstT.GetProperty(f.Name);
            if (dstF == null)
                continue;
            
            dstF.SetValue(dst, f.GetValue(src, null), null);
        }
    }
使用系统;
使用System.IO;
使用System.Runtime.Serialization.Formatters.Binary;
命名空间实用程序{
内部静态类ObjectCloner{
公共静态T克隆(T obj){
使用(MemoryStream buffer=new MemoryStream()){
BinaryFormatter formatter=新的BinaryFormatter();
序列化(缓冲区,obj);
缓冲器位置=0;
反序列化(缓冲区);
返回温度;
}
}
}
}
也许还有其他更好的方法,但也许这会对你有所帮助


Chris

尽管这不能像无反射方法那样快。同意。不过,它比定制方法更方便、更具可扩展性。如果我今天有足够的选票,我会得到+1。不可变意味着没有集合属性,对吗?@lpthnc:
private set
可以。谢谢。如果你想让get保持为公共的——在同一条线上还是单独的?@Ipthnc:public int A{get;private set;}你已经在这里问过了:@yodaj007:这个人从这个问题上澄清了他的想法。我已经投票决定关闭旧的,因为我已经用C++编码了一段时间。您的示例只确保
a1
a2
都指向内存中的同一个对象,因此其中一个对象中的更改会同时反映在这两个对象中,对吗?所以它不是真的复制到另一个
A
,对吗?不是。*obj=与obj=不同。obj=在*obj复制时更改指针。我最近也遇到了类似的问题,并提出了一个通用方法-它确实使用反射:+1作为此方法。我们已经使用过很多次了,效果很好。它看起来像Object.MemberwiseClone只适用于两个相同的类,并且在类方法中?我如何编程MySerializationMethod?似乎我将使用反射。有人在下面发布了它:不需要反射
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace Utility {
    internal static class ObjectCloner {
        public static T Clone<T>(T obj) {
            using (MemoryStream buffer = new MemoryStream()) {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(buffer, obj);
                buffer.Position = 0;
                T temp = (T)formatter.Deserialize(buffer);
                return temp;
            }
        }
    }
}