我有
class A
{
public int a;
public string b;
}
如何将A复制到另一个A?在C ++中,我知道我可以做*a1 = *a2;
。 C#中有类似的东西吗?我知道我可以用反射写一个通用的解决方案,但我希望已经存在一些东西。
我正在考虑将A更改为可以为空的结构。
第2步我需要做
class B : A {}
class C : A {}
并将基础数据从B复制到C.
答案 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)
这是有人已经做过的......
答案 4 :(得分:3)
有ICloneable
接口提供Clone()
方法。
答案 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#是不同的。结构有利有弊。