【发布时间】:2018-10-24 18:25:07
【问题描述】:
我正在使用 AutoMapper 6.2.2,我有两个共享 Id 属性的源模型:
using System.Diagnostics;
using AutoMapper;
public class Outer
{
public int Id { get; set; }
public string Foo { get; set; }
public Inner Bar { get; set; }
}
public class Inner
{
public int Id { get; set; }
public string Baz { get; set; }
public string Qux { get; set; }
public string Bof { get; set; }
}
public class FlatDto
{
public int Id { get; set; }
public string Foo { get; set; }
public string Baz { get; set; }
public string Qux { get; set; }
public string Bof { get; set; }
}
public class AutoMapperProfile : Profile
{
public AutoMapperProfile()
{
this.CreateMap<Outer, FlatDto>()
.ForMember(dst => dst.Id, opt => opt.MapFrom(s => s.Id))
.ForMember(dst => dst.Foo, opt => opt.MapFrom(s => s.Foo))
.ForMember(dst => dst.Baz, opt => opt.MapFrom(s => s.Bar.Baz))
.ForMember(dst => dst.Qux, opt => opt.MapFrom(s => s.Bar.Qux))
.ForMember(dst => dst.Bof, opt => opt.MapFrom(s => s.Bar.Bof));
}
}
class Program
{
static void Main(string[] args)
{
Outer model = new Outer
{
Id = 1,
Foo = "FooString",
Bar = new Inner
{
Id = 2,
Baz = "BazString",
Qux = "QuxString",
Bof = "BofString"
}
};
var config = new MapperConfiguration(cfg => cfg.AddProfiles(typeof(Program).Assembly));
config.AssertConfigurationIsValid();
IMapper mapper = new Mapper(config);
FlatDto dto = mapper.Map<Outer, FlatDto>(model);
Trace.Assert(model.Id == dto.Id);
Trace.Assert(model.Foo == dto.Foo);
Trace.Assert(model.Bar.Baz == dto.Baz);
Trace.Assert(model.Bar.Qux == dto.Qux);
Trace.Assert(model.Bar.Bof == dto.Bof);
}
}
我希望 FlatDto.Id 来自 Outer 和其他参数都按名称。在这种情况下,AutoMapper 的约定非常清楚,但是我无法修改这些属性。当前,每个 dest 属性都使用 ForMember 显式映射。类似question 的解决方案实际上更长。
对于两种模型都包含多个字段且只有一个重叠并需要显式处理的情况,是否存在更优雅的解决方案?
【问题讨论】:
-
那么你想要
Inner在Outer里面吗?你想用FlatDto做什么? -
源模型是外部模型和内部模型,我将它们展平为 FlatDto 的一个实例。
-
如果你能提供一个minimal reproducible example 带有样本输入和基于这些样本输入的预期输出,那就太棒了。
-
见this。您链接到的问题中也有类似的东西。
-
问题已更新为包含一个工作示例。
标签: c# automapper