如何创建一个没有任何引用的类对象的副本? ICloneable
制作一个类对象的副本(通过浅拷贝),但不支持深度复制。我正在寻找一个足够聪明的函数来读取类对象的所有成员,并且在不指定成员名的情况下对另一个对象进行深层复制。如何创建没有任何引用的类对象的副本?
5
A
回答
4
我看到这是一个解决方案,基本上都是写自己的函数来做到这一点,因为你说的关于ICloneable没有做深拷贝
public static T DeepCopy(T other)
{
using (MemoryStream ms = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, other);
ms.Position = 0;
return (T)formatter.Deserialize(ms);
}
}
我引用这个线程什么。 copy a class, C#
0
public static object Clone(object obj)
{
object new_obj = Activator.CreateInstance(obj.GetType());
foreach (PropertyInfo pi in obj.GetType().GetProperties())
{
if (pi.CanRead && pi.CanWrite && pi.PropertyType.IsSerializable)
{
pi.SetValue(new_obj, pi.GetValue(obj, null), null);
}
}
return new_obj;
}
您可以根据自己的需要进行调整。例如,
if (pi.CanRead && pi.CanWrite &&
(pi.PropertyType == typeof(string) ||
pi.PropertyType == typeof(int) ||
pi.PropertyType == typeof(bool))
)
{
pi.SetValue(new_obj, pi.GetValue(obj, null), null);
}
OR
if (pi.CanRead && pi.CanWrite &&
(pi.PropertyType.IsEnum || pi.PropertyType.IsArray))
{
...;
}
[克隆所有对象图]的
+0
这是以某种方式递归的方式,我无法清楚地看到吗? –
相关问题
- 1. 如何创建对象的副本?
- 2. 如何在C#中创建对象的引用副本?
- 3. 如何使用不同的引用创建同一对象的副本?
- 4. 在C++中创建没有RVO的对象和副本ctors
- 5. 如何为不采用NSCopying的类创建对象实例的副本?
- 6. Convert.ChangeType()是否创建对象的副本或返回原始对象的引用?
- 7. 创建包裹对象的副本
- 8. 如何创建File对象的独立完整副本?
- 9. 如何创建自定义对象或集合的副本?
- 10. 如何在不创建副本的情况下返回对象?
- 11. 如何在JavaScript中创建File对象的修改副本?
- 12. 如何制作一个没有参考的对象的副本?
- 13. 如何创建未链接到原始对象的python对象的副本?
- 14. 如何创建未连接到原始对象的对象的副本
- 15. 如何创建对现有模型对象的引用?
- 16. C#如何创建没有类定义的对象?
- 17. C++如何创建链接列表的副本作为类对象?
- 18. 是否从unique_ptr返回引用有时会创建其对象的副本?
- 19. 如何引用没有定义变量的现有类对象?
- 20. 如何使用对现有对象的聚合引用来创建新对象?
- 21. 如何引用创建对象的对象?
- 22. 如何使用变量创建对我的对象的引用?
- 23. 如何制作对象的副本
- 24. 如何制作JavaScript对象的副本?
- 25. 如何返回对象的副本?
- 26. 如何用javassist创建一个类的副本?
- 27. 如何创建引用现有嵌套属性的新对象?
- 28. 如何创建一组uiimages的副本?
- 29. 如何创建数组的副本?
- 30. 如何使用现有对象的新引用创建新对象java
可能重复(http://stackoverflow.com/questions/2417023/clone-whole-object-graph) – xanatos
快速和肮脏的解决方案是序列化对象,并立即反序列化到另一个对象。当然,这取决于对象是否可以正确序列化... – canon