Как отобразить в целевой объект только для get? - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть источник и тип назначения, подобные этим.

public class Source {
    public int A { get; set; }
    public SourceChild Child { get; } = new SourceChild ();
}

public class SourceChild {
    public int B { get; set; }
}

public class Destination {
    public int A { get; set; }
    public DestinationChild Child { get; } = new DestinationChild();
}

public class DestinationChild {
    public int B { get; set; }
}

Я создаю свое отображение в профиле тривиальным способом без какой-либо дополнительной настройки.

...
this.CreateMap<Source, Destination>();
this.CreateMap<SourceChild, DestinationChild>();
...

Когда я пытаюсь отобразить, я обнаружил, что в результате объект Destination свойство Child представляет собой пустой экземпляр DestinationChild, имеющий B, равный нулю.

var source = new Source() {
    A = 1,
    Child = {
        B = 2
    }
};

var destination = mapper.Map<Source, Destination>(source);

Я ожидаю, что destination.Child.B равно 2.

Я пытался добавить конфигурацию UseDestinationValue для целевого элемента Child, но ничего не изменилось.

Любые идеи будут оценены.

ОБНОВЛЕНИЕ

Я не ожидал этого, но похоже, что он будет работать, если в конфигурации сопоставления будет явно указан MapFrom вот так.

...
this.CreateMap<Source, Destination>()
    .ForMember(e => e.Child, o => o.MapFrom(e => e.Child));
this.CreateMap<SourceChild, DestinationChild>();
...

Итак, мой следующий вопрос: зачем это нужно? Разве это не будет ожидаться в качестве поведения по умолчанию по соглашению?

ОБНОВЛЕНИЕ 2

Просто копать еще дальше, если у меня есть только для получения ребенка List<T> свойство в root объекте, оно также не отобразится, если я не добавлю явное MapFrom. Однако, если у меня есть свойство «только для получения» List<T> внутри «только для получения» DestinationChild, то оно будет заполнено из союса очень хорошо. Я чувствую, что здесь есть противоречивое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...