将课程复制到另一个课程?

8 .net c# copy class

我有

class A
{
    public int a;
    public string b;
}
Run Code Online (Sandbox Code Playgroud)

如何将A复制到另一个A?在C++我知道我能做到*a1 = *a2;.C#中有类似的东西吗?我知道我可以用反射写一个通用的解决方案,但我希望已经存在的东西.

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

第2步我需要做

class B : A {}
class C : A {}
Run Code Online (Sandbox Code Playgroud)

并将基础数据从B复制到C.

Jer*_*uel 8

我使用了二进制序列化.基本上,将实例序列化为内存流.然后,将其反序列化为内存流.您将拥有一个精确的二进制副本.它将是一个深层复制,而不是浅层复制.

class a = new ClassA();

class b = MySerializationMethod(a);
Run Code Online (Sandbox Code Playgroud)

对于浅拷贝,您可以使用 Object.MemberwiseClone


小智 7

这是一些适用于任何类的简单代码,而不仅仅是基类.

    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)
                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);
        }
    }
Run Code Online (Sandbox Code Playgroud)


wom*_*omp 5

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

A newA = instanceOfA.MemberwiseClone();
Run Code Online (Sandbox Code Playgroud)

不过 MemberwiseClone() 是一个浅表复制,因此如果您的类变得复杂,并且属性也是引用类型,那么这对您不起作用。