[英]AutoMapper from list in DTO to individual object
我有下面的DTO,我需要将其映射到平面视图模型,这个想法是来自请求的一些属性是共享的,但可能会有一个名称列表。
public class ShinyDTO
{
public List<UserDetails> Users { get; set; }
public string SharedPropertyOne { get; set; }
public string SharedPropertyTwo { get; set; }
}
public class UserDetails
{
public string Title { get; set; }
public string Forename { get; set; }
public string Surname { get; set; }
}
public class MyRealClass
{
public string SharedPropertyOne {get;set;}
public string SharedPropertyTwo {get;set;}
public string Title {get;set;}
public string Forename {get;set;}
public string Surname {get;set;}
}
//This will map all the shared properties
MyRealClass request = Mapper.Map<MyRealClass>(dto);
foreach (var record in dto.Users){
//This bit overwrites the properties set above and then I only have the properties set for Forename, Surname, etc...
request = Mapper.Map<MyRealClass>(record);
}
我需要将其映射到MyRealClass列表中。 我已经尝试创建单独的映射,然后在foreach中循环它,但这保持删除初始属性。
我也尝试设置第二个映射来忽略上面设置的属性,我无法使其工作,它仍然覆盖属性。
var autoMapperConfiguration = new MapperConfigurationExpression();
autoMapperConfiguration
.CreateMap<MyRealClass, UserDetails>()
.ForMember(c => c.SharedPropertyOne, d => d.Ignore())
.ForMember(c => c.SharedPropertyTwo, d => d.Ignore());
我认为你很接近,但你的问题是:
我需要将其映射到
MyRealClass
列表中
...并且您尝试映射将MyRealClass
映射到UserDetails
。 看起来你真的想要从UserDetails
到MyRealClass
的地图。
无论如何,这是实现这一目标的一种方法:
var autoMapperConfiguration = new MapperConfigurationExpression();
autoMapperConfiguration.CreateMap<UserDetails, MyRealClass>();
autoMapperConfiguration.CreateMap<ShinyDTO, MyRealClass>();
var results = new List<MyRealClass>();
foreach(var record in dto.Users) {
var mapped = Mapper.Map<MyRealClass>(dto);
Mapper.Map(record, mapped);
results.Add(mapped);
}
这里,第二个Mapper.Map
调用将record
mapped
到mapped
,它不应该覆盖已经从ShinyDTO
映射到ShinyDTO
的映射的MyRealClass
。
您也可以在ConstructUsing
调用中获得所有这些,但这对我来说似乎更清晰。
您可以在UserDetails
和IEnumerable<MyRealClass>
之间创建一个映射。
var autoMapperConfiguration = new MapperConfigurationExpression();
autoMapperConfiguration
.CreateMap<IEnumerable<MyRealClass>, UserDetails>()
.ForMember(dest => dest.SharedPropertyOne, opt => opt.MapFrom(x => x.get(0).SharedPropertyOne)); //you can check if the list is empty
.ForMember(dest => dest.SharedPropertyTwo, opt => opt.MapFrom(x => x.get(0).SharedPropertyTwo)); //you can check if the list is empty
.AfterMap((src,dest) => //src is a list type
{
foreach(MyRealClass myrealclass in src)
dest.Users.add(new UserDetails(){
Title = myrealclass.Title,
Forename = myrealclass.Forename,
Surname = myrealclass.Surname
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.