1

我是 AutoMapper 新手。我的映射没有按预期工作,我确定我做错了什么,但无法弄清楚。对不起,如果这个问题令人困惑,但我会尽力澄清。假设我们有三个类:

public class Person
{
    public ContactInfo1 Contact { get; set; }
}

public class ContactInfo1
{
    public string Name { get; set; }
}

public class ContactInfo2
{
    public string AnotherName { get; set; }
}

现在,我想设置我的映射,以便 ContactInfo1 可以映射到 ContactInfo2 和从 ContactInfo2 映射。然后我希望能够映射 Person1 -> ContactInfo2 (这可能看起来很奇怪,但无论如何我都需要这样做)。我尝试了以下映射配置:

var autoMapperConfig = new AutoMapper.MapperConfiguration(cfg =>
{
    cfg.CreateMap<ContactInfo1, ContactInfo2>()
        .ForMember(dest => dest.AnotherName, opt => opt.MapFrom(src => src.Name)).ReverseMap();
    cfg.CreateMap<ContactInfo2, Person>()
        .ForMember(dest => dest.Contact, opt => opt.MapFrom(src => src)).ReverseMap();
    });

var mapper = autoMapperConfig.CreateMapper();

对于测试数据:

var testPerson = new Person();
testPerson.Contact = new ContactInfo1() { Name = "Person1" };

我执行以下操作:

var contactInfo2Test = mapper.Map<Person, ContactInfo2>(testPerson);

这不会给我任何错误,但 contactInfo2Test.AnotherName 是空的。请指教!谢谢。

请注意,我意识到我可以去:

cfg.CreateMap<Person, ContactInfo2>()
    .ForMember(dest => dest.AnotherName, opt => opt.MapFrom(src => src.Contact.Name));

然后我会重新映射 Contact1->Contact2,在更复杂的情况下,我真的想避免这种情况。

4

1 回答 1

2

这是一种方法:

var autoMapperConfig = new AutoMapper.MapperConfiguration(cfg =>
{
    cfg.CreateMap<ContactInfo1, ContactInfo2>()
        .ForMember(dest => dest.AnotherName, opt => opt.MapFrom(src => src.Name))
        .ReverseMap();
    cfg.CreateMap<Person, ContactInfo2>()
        .ConstructUsing((p, ctx) => ctx.Mapper.Map<ContactInfo2>(p.Contact));
});
于 2018-03-09T23:47:49.597 回答