У меня есть источник и тип назначения, подобные этим.
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
, то оно будет заполнено из союса очень хорошо. Я чувствую, что здесь есть противоречивое поведение.