复杂第三方的深拷贝 Objects/Classes

Deep Copy of Complex Third Party Objects/Classes

我一直在从事一个使用 PDFView4Net 创建 PDF 表单的项目。虽然库通常很好,但表单创建器是原始的并且在处理表单字段(即文本框、复选框等)时缺乏基本功能(例如 copy/paste、对齐、格式化等)。

问题:我一直在扩展字段对象的功能并在 copy/paste 上被绊倒了。为此,我需要对象的深层副本,不引用任何原始对象。我给供应商发了电子邮件,要求他们提供有关复制这些对象的推荐方法的信息,他们回复说我需要手动制作每个 属性 的副本... beats head on desk。这些是大型 classes,具有多个嵌入的 classes 作为属性,以及 UI 元素。

问题:有没有好的方法可以对不需要序列化的复杂对象执行深拷贝,不需要访问或更改源 classes 并且不需要默认构造函数?

我有什么tried/reviewed: 我研究了各种方法来制作一个对象的深拷贝,并一一丢弃:

编辑: 我真的不觉得这个问题是重复的。我广泛搜索了解决方案,包括标记为 duplicate/original 的 post,但未能找到令人满意的解决方案。如前所述,我无权更改我需要复制的 classes。这会打折 DataContractSerializer、BinaryFormatter 和任何其他类型的序列化。这也打折了我看到的使用 Activator.CreateInstance 的反射示例,因为我需要复制的 classes 中大约 95% 没有采用 0 个参数的构造函数。这与我 运行 使用 ValueInjecter 时遇到的问题相同。这也使用 ICloneable 打折。

我会为此使用 AutoMapper。考虑以下 class 定义:(注意 private ctor)

public class Parent
{
    public string Field1 { get; set; }
    public Level1 Level1 { get; set; }
    public static Parent GetInstance()
    {
        return new Parent() { Field1 = "1", Level1 = new Level1 { Field2 = "2", Level2 = new Level2() { Field3 = "3"}}};
    }
    private Parent()  {              }
}

public class Level1
{
    public string Field2 { get; set; }
    public Level2 Level2 { get; set; }
}

public class Level2
{
    public string Field3 { get; set; }
}

然后您可以根据需要将 AutoMapper 设置为深度克隆:

[TestMethod]
public void DeepCloneParent()
{
    Mapper.CreateMap<Parent, Parent>();
    Mapper.CreateMap<Level1, Level1>();
    Mapper.CreateMap<Level2, Level2>();
    var parent = Parent.GetInstance();

    var copy = Mapper.Map<Parent, Parent>(parent);

    Assert.IsFalse(copy == parent);//diff object
    Assert.IsFalse(copy.Level1 == parent.Level1);//diff object
    Assert.IsFalse(copy.Level1.Level2 == parent.Level1.Level2);//diff object
    Assert.AreEqual("1", copy.Field1);
    Assert.AreEqual("2", copy.Level1.Field2);
    Assert.AreEqual("3", copy.Level1.Level2.Field3);
}