我有一个源对象,其中包含对同一集合的 2 个引用。如果我将源类型映射到结构等效的目标类型,AutoMapper 将在目标实例中创建集合的两个实例。
class SourceThing
{
public string Name { get; set; }
public List<int> Numbers { get; set; }
public List<int> MoreNumbers { get; set; }
}
class TargetThing
{
public string Name { get; set; }
public List<int> Numbers { get; set; }
public List<int> MoreNumbers { get; set; }
}
如果我创建一个SourceThing
对同一个列表有两个引用的 a ,将它映射到 a TargetThing
,结果是 aTargetThing
具有两个单独的集合实例。
public void MapObjectWithTwoReferencesToSameList()
{
Mapper.CreateMap<SourceThing, TargetThing>();
//Mapper.CreateMap<List<int>, List<int>>(); // passes when mapping here
var source = new SourceThing() { Name = "source" };
source.Numbers = new List<int>() { 1, 2, 3 };
source.MoreNumbers = source.Numbers;
Assert.AreSame(source.Numbers, source.MoreNumbers);
var target = Mapper.Map<TargetThing>(source);
Assert.IsNotNull(target.Numbers);
Assert.AreSame(target.Numbers, target.MoreNumbers); // fails
}
这是否意味着 AutoMapper 中具体集合的默认映射行为?通过测试,我意识到如果我映射List<int>
到List<int>
,我实现了我想要的行为,但我不明白为什么。如果 AutoMapper 跟踪引用并且不重新映射映射对象,它不会看到source.MoreNumbers
指向与 相同的列表source.Numbers
,并相应地设置目标吗?