我有一堆不同类型的简单数据对象(所有属性都是可写的,没有隐藏状态)。是否有任何自动方法来克隆这些对象? (是的,我知道手动克隆它们的方法。只是不想^ _ ^)
答案 0 :(得分:4)
在(内存)流中序列化它们并反序列化它们。
答案 1 :(得分:3)
序列化和反序列化将克隆您的对象。当然,该对象需要是可序列化的。
public static T Clone<T>(T source)
{
IFormatter formatter = new BinaryFormatter();
using (Stream stream = new MemoryStream())
{
formatter.Serialize(stream, source);
stream.Seek(0, SeekOrigin.Begin);
return (T)formatter.Deserialize(stream);
}
}
答案 2 :(得分:1)
最好的方法是在所有对象中实现IClonable接口,但是如果不是由您开发的对象不适合您。
第二种方式(我认为最普遍)是使用反射:
public T CommonClone<T>(T Source)
{
T ret = System.Activator.CreateInstance<T>();
Type typeDescr = typeof(T);
if (typeDescr.IsClass != true)
{
ret = Source;
return ret;
}
System.Reflection.FieldInfo[] fi = typeDescr.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
for (int i = 0; i < fi.Length; i++)
{
fi[i].SetValue(ret, fi[i].GetValue(Source));
}
return ret;
}
上面的代码将复制公共和私人字段。如果您只需要处理公开的问题,请从BindingFlags.NonPublic
方法调用中删除GetFields
这种方式没有对可以使用的对象指定任何限制。它适用于类和结构。
答案 3 :(得分:0)
你可能会看到这个 Deep cloning objects 看看第二个答案。我一直使用它,效果很好。这个解决方案的唯一缺点是类必须是可序列化的
答案 4 :(得分:0)
using System.Web.Helpers;
public static T Clone<T>(T source)
{
return Json.Decode<T>(Json.Encode(source));
}