复制参考而不是新的深拷贝

时间:2014-06-29 16:48:28

标签: c# automapper

我有一个用于复制Person和State的映射,但是当我复制州时,我不想要一个人的深层副本,只需要参考,但是我使用的是automapper来创建一个人的深层副本否则,也有人和国家的映射。

    public class Person
    {
        public string Name { get; set; }
    }

    public class State
    {
        public string Name { get; set; }
        public Person CreatedBy { get; set; }
    }

    [TestMethod]
    public void CopyByReference()
    {
        Mapper.CreateMap<Person, Person>();
        Mapper.CreateMap<State, State>();

        var original = new State { Name = "Start", CreatedBy = new Person { Name = "Employee name" } };
        var copy = Mapper.Map<State>(original);
        Assert.AreEqual(original.Name, copy.Name);
        if (!ReferenceEquals(original.CreatedBy, copy.CreatedBy))
        {
            throw new Exception("I need a reference copy, not deep copy.");
        }
    }

我试图实现一个IValueResolver,但我也得到了深层复制。我可以简单地忽略CreatedBy属性并在映射后复制引用,但这非常难看并且看起来很容易出错。

2 个答案:

答案 0 :(得分:2)

Automapper并不是真的为此设计的,因此如果它找到了一个,它总是会尝试使用映射,所以它总是试图映射你的Person个对象......

一个解决方法是Ignore CreatedBy上的State,并在AfterMap回调中复制它:

Mapper.CreateMap<State, State>()
    .ForMember(d => d.CreatedBy, c => c.Ignore())
    .AfterMap((src, dest) => { dest.CreatedBy = src.CreatedBy; });

答案 1 :(得分:0)

您可以删除此行:Mapper.CreateMap<Person, Person>();

这应该使AutoMapper复制引用而不执行深层复制。