C# 复制引用而不是新的深度复制
我有一个映射来复制一个人和一个状态,但是当我复制状态时,我不需要一个人的深度复制,只需要引用,但我正在使用automapper在其他地方创建一个人的深度复制,所以有一个个人和状态的映射C# 复制引用而不是新的深度复制,c#,automapper,C#,Automapper,我有一个映射来复制一个人和一个状态,但是当我复制状态时,我不需要一个人的深度复制,只需要引用,但我正在使用automapper在其他地方创建一个人的深度复制,所以有一个个人和状态的映射 public class Person { public string Name { get; set; } } public class State { public string Name { get; set; } p
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.");
}
}
公共类人物
{
公共字符串名称{get;set;}
}
公共阶级国家
{
公共字符串名称{get;set;}
由{get;set;}创建的公共人物
}
[测试方法]
public void CopyByReference()
{
CreateMap();
CreateMap();
var original=newstate{Name=“Start”,CreatedBy=newperson{Name=“Employee Name”};
var copy=Mapper.Map(原件);
Assert.AreEqual(original.Name,copy.Name);
如果(!ReferenceEquals(original.CreatedBy,copy.CreatedBy))
{
抛出新异常(“我需要引用副本,而不是深度副本”);
}
}
我曾尝试实现一个IValueResolver,但我也得到了深度拷贝。我可以简单地忽略CreatedBy属性并在映射后复制引用,但这非常难看,而且看起来很容易出错。Automapper并不是专门为此而设计的,所以它在找到映射时总是尝试使用映射,所以它总是尝试映射您的
Person
对象
一种解决方法是忽略在状态上创建的CreatedBy
,并在AfterMap
回调中复制它:
Mapper.CreateMap<State, State>()
.ForMember(d => d.CreatedBy, c => c.Ignore())
.AfterMap((src, dest) => { dest.CreatedBy = src.CreatedBy; });
Mapper.CreateMap()
.ForMember(d=>d.CreatedBy,c=>c.Ignore())
.AfterMap((src,dest)=>{dest.CreatedBy=src.CreatedBy;});
您可以删除这一行:Mapper.CreateMap()代码>
这将使AutoMapper复制引用,而不是执行深度复制