Как заставить AutoMapper не кэшировать сопоставленные объекты?

Когда 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();
    }
}
23
задан Josh Close 23 March 2015 в 21:57
поделиться