鉴于以下课程:
class A
{
public List<B> ListB;
// etc...
}其中B是另一个可以继承/包含其他类的类。
鉴于这种情况:
A是一个大型类,包含许多引用类型。B标记为[Serializable],因为我无法访问B的源代码执行深度复制的下列方法不起作用:
ICloneable或MemberwiseClone作为类A包含许多引用类型A编写一个复制构造函数,因为这个类很大并且不断地被添加到其中,并且包含不能被深度复制的类(比如B)。B,其中没有可用的源代码)标记为[Serializable]。如何深入复制类A
发布于 2010-03-30 12:46:50
无论如何,我停止了使用序列化进行深度复制,因为没有足够的控制(不是每个类都需要以相同的方式复制)。然后,我开始实现自己的深拷贝接口,并以复制的方式复制每个属性。
复制引用类型的典型方法:
示例:
class A
{
// copy constructor
public A(A copy) {}
}
// a referenced class implementing
class B : IDeepCopy
{
object Copy() { return new B(); }
}
class C : IDeepCopy
{
A A;
B B;
object Copy()
{
C copy = new C();
// copy property by property in a appropriate way
copy.A = new A(this.A);
copy.B = this.B.Copy();
}
}你可能会认为这是一项巨大的工作。但是在最后,它是简单和直接的,可以调整到需要的地方,做你需要做的事情。
发布于 2012-04-01 03:44:11
你可以试试这个。对我来说很管用
public static object DeepCopy(object obj)
{
if (obj == null)
return null;
Type type = obj.GetType();
if (type.IsValueType || type == typeof(string))
{
return obj;
}
else if (type.IsArray)
{
Type elementType = Type.GetType(
type.FullName.Replace("[]", string.Empty));
var array = obj as Array;
Array copied = Array.CreateInstance(elementType, array.Length);
for (int i = 0; i < array.Length; i++)
{
copied.SetValue(DeepCopy(array.GetValue(i)), i);
}
return Convert.ChangeType(copied, obj.GetType());
}
else if (type.IsClass)
{
object toret = Activator.CreateInstance(obj.GetType());
FieldInfo[] fields = type.GetFields(BindingFlags.Public |
BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo field in fields)
{
object fieldValue = field.GetValue(obj);
if (fieldValue == null)
continue;
field.SetValue(toret, DeepCopy(fieldValue));
}
return toret;
}
else
throw new ArgumentException("Unknown type");
}感谢代码项目上的DetoX83 文章。
发布于 2010-03-30 12:31:13
你不能这么做吗?
[Serializable]
class A
{
...
[NonSerialized]
public List<B> ListB;
....
},然后参考如何在.NET (特别是C#)中对对象进行深度复制?获取克隆函数。
https://stackoverflow.com/questions/2545025
复制相似问题