首页 > 解决方案 > 如何映射到仅获取目标子对象?

问题描述

我有一个类似于这些的源和目标类型。

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属性是一个等于零的实例。DestinationChildB

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>在根对象中有一个 get-only 子属性,它也不会映射,除非我添加显式MapFrom. 但是,如果我在 get-only 中有一个 get-only 子List<T>属性DestinationChild,那么它将很好地从 soruce 填充。我觉得这里有一些不一致的行为。

标签: c#automapper

解决方案


推荐阅读