终于让automapper工作了:上一个问题1,上一个第2。
现在我有这样的东西:
public class Steps
{
public PersonalModel Personal1 { get; set; }
public CompanyModel Company2 { get; set; }
public SposeModel Spose3 { get; set; }
}
public class PersonalModel
{
public int Id { get; set; }
}
public class CompanyModel
{
public string Name { get; set; }
}
public class SposeModel
{
public string Age { get; set; }
}
和:
public class Content
{
public string Dummy1 { get; set; }
public string Dummy2 { get; set; }
public string Dummy3 { get; set; }
public string Dummy4 { get; set; }
public string Dummy5 { get; set; }
public Personal Personal { get; set; }
public Company Company { get; set; }
public Spose Spose { get; set; }
}
public class Personal
{
public int Id { get; set; }
}
public class Company
{
public string Name { get; set; }
}
public class Spose
{
public string Age { get; set; }
}
除了名称和复杂性之外,这些对象在模式上与我的原始对象相似
映射如下:
public class AutoMapperConfig
{
public static MapperConfiguration MapperConfiguration { get; set; }
public static void Configure()
{
MapperConfiguration = new MapperConfiguration(cfg => {
cfg.AddProfile<Out>();
cfg.CreateMap<Steps, Content>();
});
MapperConfiguration.AssertConfigurationIsValid();
}
}
public class Out: Profile
{
protected override void Configure()
{
CreateMap<PersonalModel, Personal>();
CreateMap<CompanyModel, Company>();
CreateMap<SposeModel, Spose>();
CreateMap<Steps, Content>();
.ForMember(dest => dest.Personal, opt => opt.MapFrom(src => src.Personal1))
.ForMember(dest => dest.Company, opt => opt.MapFrom(src => src.Company2))
.ForMember(dest => dest.Spose, opt => opt.MapFrom(src => src.Spose3))
.ForMember(dest => dest.Dummy1, opt => opt.Ignore())
.ForMember(dest => dest.Dummy2, opt => opt.Ignore())
.ForMember(dest => dest.Dummy3, opt => opt.Ignore())
.ForMember(dest => dest.Dummy4, opt => opt.Ignore())
.ForMember(dest => dest.Dummy5, opt => opt.Ignore());
}
}
我想优化映射(谈到了另一个问题,不要让另一个太复杂),就像在GitHub的AutoMapper配置文档中一样,我看到了RecognizePostfix
方法。但当我把下一行放在配置部分:
cfg.RecognizePostfix(new string[3] {"1", "2", "3"});
并从配置文件中删除下一个:
.ForMember(dest => dest.Personal, opt => opt.MapFrom(src => src.Personal1))
.ForMember(dest => dest.Company, opt => opt.MapFrom(src => src.Company2))
.ForMember(dest => dest.Spose, opt => opt.MapFrom(src => src.Spose3))
我得到一个例外:
AutoMapper.AutoMapperConfiguration异常:未映射的成员为建立查看下面的类型和成员。添加自定义映射表达式、忽略、添加自定义冲突解决程序或修改源/目的地类型
我在这里做错了什么?
实际上,我不知道这是否应该被视为一个bug,也不知道它应该如何工作,但显然预/后修复只适用于定义它的概要文件。
在您的情况下,您可以快速解决将RecognizePostfixes
调用移动到配置文件的问题:
public static void Configure()
{
MapperConfiguration = new MapperConfiguration(cfg => {
cfg.AddProfile<Out>();
});
MapperConfiguration.AssertConfigurationIsValid();
}
...
配置文件:
public class Out : Profile
{
protected override void Configure()
{
RecognizePostfixes("1", "2", "3");
CreateMap<PersonalModel, Personal>();
CreateMap<CompanyModel, Company>();
CreateMap<SposeModel, Spose>();
CreateMap<Steps, Content>()
.ForMember(dest => dest.Dummy1, opt => opt.Ignore())
.ForMember(dest => dest.Dummy2, opt => opt.Ignore())
.ForMember(dest => dest.Dummy3, opt => opt.Ignore())
.ForMember(dest => dest.Dummy4, opt => opt.Ignore())
.ForMember(dest => dest.Dummy5, opt => opt.Ignore());
}
}