msl*_*sap 8 c# clone deep-copy automapper valueinjecter
我一直致力于使用PDFView4Net创建PDF表单的项目.虽然库通常很好,但在使用表单字段(即文本框,复选框等)时,表单创建器是原始的并且缺少基本功能(例如复制/粘贴,对齐,格式化等).
问题:我一直在扩展字段对象的功能,并在复制/粘贴时被绊倒.要做到这一点,我需要一个对象的深层副本,而不需要引用任何原始对象.我通过电子邮件发送给供应商,要求提供有关他们推荐的复制这些对象的方法的信息,他们回复说我需要手工制作每个属性的副本,手动...在桌面上敲打.这些是大类,具有多个嵌入类作为属性,以及UI元素.
问题:是否有任何好的方法可以为不需要序列化的复杂对象执行深层复制,不需要访问或更改源类,也不需要默认构造函数?
我尝试过/审查过的内容:我研究了各种方法来制作一个对象的深层副本并逐个丢弃它们:
编辑:我真的不觉得这个问题是重复的.我已经广泛搜索了一个解决方案,包括标记为重复/原始的帖子,但无法找到满意的解决方案.如上所述,我无权更改我需要复制的类.这折扣了DataContractSerializer,BinaryFormatter和任何其他类型的序列化.这也打破了我使用Activator.CreateInstance看到的反射示例,因为我需要复制的类中大约95%没有带0参数的构造函数.这与我使用ValueInjecter遇到的问题相同.这也使用ICloneable进行折扣.
我会为此使用 AutoMapper。考虑以下类定义:(注意 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; }
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以根据需要将 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);
}
Run Code Online (Sandbox Code Playgroud)