我正在尝试找到复制一个相当大的课程的最佳方法。它有大约80个属性。我当然可以将它们全部编码在一个普通的复制构造函数中,但我不确定在代码中看起来有多好。
所以我在想...有没有办法遍历 obj A 的属性并将值分配给 obj B 的相应属性?
这个queston被标记为重复,但它不是。我的问题不是如何进行深层复制,而是如何遍历属性,从而创建具有许多属性的普通复制构造函数。
我正在尝试找到复制一个相当大的课程的最佳方法。它有大约80个属性。我当然可以将它们全部编码在一个普通的复制构造函数中,但我不确定在代码中看起来有多好。
所以我在想...有没有办法遍历 obj A 的属性并将值分配给 obj B 的相应属性?
这个queston被标记为重复,但它不是。我的问题不是如何进行深层复制,而是如何遍历属性,从而创建具有许多属性的普通复制构造函数。
这是一种方法:
public static T DeepClone<T>(T original)
{
if (!typeof(T).IsSerializable)
{
throw new ArgumentException("The type must be serializable.", "original");
}
if (ReferenceEquals(original, null))
{
return default(T);
}
using (var stream = new MemoryStream())
{
var formatter = new BinaryFormatter
{
Context = new StreamingContext(StreamingContextStates.Clone)
};
formatter.Serialize(stream, original);
stream.Position = 0;
return (T) formatter.Deserialize(stream);
}
}
这是由 Jeffrey Richter 通过 C#改编自CLR 。
你像这样使用它:
var objB = DeepClone(objA);
但是,该类型必须是可序列化的才能工作。