如何創建一個沒有任何引用的類對象的副本? 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. 如何創建對象的副本?
- 3. 如何在C#中創建對象的引用副本?
- 4. 如何在ActionScript中創建對象的未引用副本
- 5. 創建對象的副本
- 6. 如何使用不同的引用創建同一對象的副本?
- 7. Java - 創建沒有任何對象的文本冒險,
- 8. 在C++中創建沒有RVO的對象和副本ctors
- 9. 如何爲不採用NSCopying的類創建對象實例的副本?
- 10. 創建我的對象的副本
- 11. Convert.ChangeType()是否創建對象的副本或返回原始對象的引用?
- 12. 創建對象的獨立副本
- 13. 創建包裹對象的副本
- 14. 如何創建File對象的獨立完整副本?
- 15. 如何創建自定義對象或集合的副本?
- 16. 如何在不創建副本的情況下返回對象?
- 17. 如何在JavaScript中創建File對象的修改副本?
- 18. 如何製作一個沒有參考的對象的副本?
- 19. 如何創建未連接到原始對象的對象的副本
- 20. 如何創建未鏈接到原始對象的python對象的副本?
- 21. 如何創建對現有模型對象的引用?
- 22. C++如何創建鏈接列表的副本作爲類對象?
- 23. C#如何創建沒有類定義的對象?
- 24. 是否從unique_ptr返回引用有時會創建其對象的副本?
- 25. 如何引用沒有定義變量的現有類對象?
- 26. 如何用ruby中的對象(類)創建一個對象(類)?
- 27. 如何訪問沒有對象引用的類中的屬性
- 28. 如何爲任何對象創建JobParameterBuilder?
- 29. 如何使用對現有對象的聚合引用來創建新對象?
- 30. 如何創建與已有對象相同類的新對象?
可能重複(http://stackoverflow.com/questions/2417023/clone-whole-object-graph) – xanatos
快速和骯髒的解決方案是序列化對象,並立即反序列化到另一個對象。當然,這取決於對象是否可以正確序列化... – canon