Когда AutoMapper встречает объект, который уже был отображен, кажется, что он снова использует этот объект, вместо того чтобы пытаться повторно -сопоставить его. Я считаю, что это делается на основе .Equals()
.
У меня есть дерево, которое отображается на карте. Итак, узел с некоторыми свойствами и потомками. Несколько узлов имеют одинаковое значение .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();
}
}