我有一个用于复制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; });