我正在寻找一种克隆在编译时(或者我认为是运行时)未知的对象的方法。问题的确切措辞是“编写一个可以克隆任意对象的函数”,例如
我猜我需要使用Reflection来读取函数和变量,然后一些如何创建一个新对象并将这些值赋给它。我可以使用Type.GetType()来查找类型并创建一个新实例,然后使用这个已知对象的复制构造函数。但是我不确定给定的类是否会有一个实现(深度),或者问题是否要求这样的解决方案(没有帮助我不明白所需的结果是什么!)。
有人可以指导我正确的方向,需要使用类/接口吗?如果你感觉很慷慨,可以用伪代码来实现这个目标吗?
答案 0 :(得分:4)
您可以简单地Serialize
和Deserialize
一个对象来制作克隆
以下功能将执行此操作:
public object Clone(object obj)
{
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, obj);
ms.Position = 0;
object obj_clone = bf.Deserialize(ms);
ms.Close();
return obj_clone;
}
答案 1 :(得分:2)
这可以通过利用
来实现Type newObjectType = orgObject.GetType()
然后调用Activator.CreateInstance(newObjectType)。然后你要做的是循环遍历对象的所有属性并将它们设置在新对象上。这也可以通过反思来完成。
遍历orgObject.GetType()。GetProperties()中的每个PropertyInfo,并在新对象上设置值。
这确实应该创建对象的“深层”副本,与其类型无关。
编辑: 我在上面解释的方法的未经测试的代码示例。
Type newObjectType = orgObject.GetType();
object newObject = Activator.CreateInstance(newObjectType);
foreach (var propInfo in orgObject.GetType().GetProperties())
{
object orgValue = propInfo.GetValue(orgObject, null);
// set the value of the new object
propInfo.SetValue(newObject, orgValue, null);
}
希望你有一些清晰度!