C#中的深度克隆对象
本文关键字:对象 深度 | 更新日期: 2023-09-27 18:22:31
我在C#中尝试了不同的深度对象克隆技术,最终找到了一个非常优雅的解决方案,它使用反射,适用于不可序列化的类型。我只是想知道它是否有问题,以及是否有人有评论或用例不适用于这种方法。这是代码。感谢您的评论!
public static T Clone<T>(this T source)
{
// Get the type
Type type = source.GetType();
T clone = (T)Activator.CreateInstance(type);
// Loop through the properties
foreach (PropertyInfo pInfo in type.GetProperties())
{
pInfo.SetValue(clone, pInfo.GetValue(source, null), null);
}
// Loop through the fields
foreach (FieldInfo fInfo in type.GetFields())
{
fInfo.SetValue(clone, fInfo.GetValue(source).Clone());
}
return clone;
}
我可以看到几个问题:
- 您只复制公共属性和字段
- 你不克隆属性值,只是复制它。这意味着它不是属性的深度克隆
- 有些类型不容易克隆(或者根本不应该克隆),比如流或文件句柄(或者任何非托管资源)——您的方法可能会在那里遇到麻烦
- 您的方法无法处理循环引用
- 并非所有类型都有无参数构造函数
如果没有可访问的无参数构造函数怎么办?
如果有一个成员对象无法共享(可能是文件句柄),该怎么办?
非公开会员呢?
为什么需要为一个不存在的问题创建一个一刀切的解决方案(你不需要能够深度克隆所有内容!)?