Когда AutoMapper встречает объект, который уже был отображен, кажется, что он снова использует этот объект, вместо того, чтобы его повторно отображать. Я считаю, что это делается на основе .Equals()
.
У меня есть дерево, которое отображается. Итак, node с некоторыми свойствами и дочерними. Более одного из узлов имеют одинаковое значение .Equals()
, поскольку оно основывается на свойстве Id. Дети узлов различны, и мне нужны эти повторные отображения, но они используют значение кешированной карты.
Есть ли способ отключить кеширование? Все, что я могу представить, это внедрение нового конвертера, но это полностью поражает цель использования AutoMapper.
Вот пример того, как воспроизводить.
void Main()
{
var source = new List<Tag>
{
new Tag
{
Id = 1,
Name = "Tag 1",
ChildTags = new List<Tag>
{
new Tag
{
Id = 2,
Name = "Tag 2",
ChildTags = new List<Tag>
{
new Tag {Id = 3, Name = "Tag 3"},
new Tag {Id = 4, Name = "Tag 4"}
}
}
}
},
new Tag { Id = 1, Name = "Tag 1" },
new Tag
{
Id = 3, Name = "Tag 3", ChildTags = new List<Tag>
{
new Tag {Id = 4, Name = "Tag 4"}
}
}
};
Mapper.CreateMap<Tag, Tag>();
var results = Mapper.Map<IList<Tag>, IList<Tag>>(source);
results.Dump();
}
public class Tag
{
public int Id { get; set; }
public string Name { get; set; }
public IEnumerable<Tag> ChildTags { get; set; }
public override bool Equals(Object obj)
{
if (obj == null)
{
return false;
}
var x = this;
var y = (Tag)obj;
return x.Id.Equals(y.Id);
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
}