c# – 复制引用而不是新的深层复制

我有一个用于复制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属性并在映射后复制引用,但这非常难看并且看起来很容易出错.

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

一种解决方法是忽略状态上的CreatedBy并在AfterMap回调中复制它:

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