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

时间:2010-01-14 22:11:31

标签: c# .net class copy

我有

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

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

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

第2步我需要做

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

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

8 个答案:

答案 0 :(得分:8)

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

class a = new ClassA();

class b = MySerializationMethod(a);

对于浅色副本,您可以使用Object.MemberwiseClone

答案 1 :(得分:7)

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

    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);
        }
    }

答案 2 :(得分:4)

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

A newA = instanceOfA.MemberwiseClone();

虽然MemberwiseClone()是一个浅表副本,但是如果你的类变得复杂,属性也是引用类型,那么这对你不起作用。

答案 3 :(得分:4)

这是有人已经做过的......

Deep Copy in C# (Cloning for a user defined class)

答案 4 :(得分:3)

ICloneable接口提供Clone()方法。

Clone on msdn.

答案 5 :(得分:3)

添加适当的构造函数:

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; }
}

你还应该考虑让它变成不可变的,特别是如果你考虑将它变成一个结构。可变结构是邪恶的。

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

答案 6 :(得分:2)

我们已成功使用此代码:

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;
            }
        }
    }
}

可能有其他方法效果更好,但也许这会对您有所帮助

克里斯

答案 7 :(得分:0)

您可以克隆,您可以定义复制构造函数。为什么将类更改为struct只是因为在C ++中你可以用10个字符做一些事情。 C#是不同的。结构有利有弊。