I have
class A
{
public int a;
public string b;
}
如何将A复制到另一个A?在C++中,我知道可以使用*a1 = *a2;
。在C#中是否有类似的方法?我知道可以使用反射编写通用解决方案,但我希望已经存在某些方法。
我正在考虑将A更改为可空结构体。
第二步我需要执行:
class B : A {}
class C : A {}
将基础数据从B复制到C。
我已经使用了二进制序列化。基本上,将实例序列化到内存流中。然后,从内存流中反序列化出来。你将拥有一个完全相同的二进制副本。这将是深度复制,而不是浅层复制。
class a = new ClassA();
class b = MySerializationMethod(a);
对于浅复制,您可以使用 Object.MemberwiseClone
这里有一些简单的代码,适用于任何类,而不仅仅是基类。
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);
}
}
A newA = instanceOfA.MemberwiseClone();
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; }
}
如果您考虑将其转换为结构体,则还应考虑使其不可变。可变的结构体是有害的。
最后,当您从一个类继承时,您不需要将基类的成员复制到子类中。
private set
即可。 - Bruno Reisusing 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;
}
}
}
}
你可以使用Clone方法,也可以定义一个拷贝构造函数。为什么要因为在C++中只需要10个字符就改变类为结构体呢?C#是不同的。结构体有其优缺点。
a1
和a2
指向内存中的同一对象,因此对其中一个所做的更改会反映在两者中,对吗?因此,这并不真正是将其复制到另一个A
中,对吗? - Austin Salonen