C# 将DTO中的列表自动映射到单个对象

C# 将DTO中的列表自动映射到单个对象,c#,automapper,C#,Automapper,在下面的DTO中,我需要将其映射到平面视图模型,其思想是请求中的一些属性是共享的,但是可能会有一个名称列表 public class ShinyDTO { public List<UserDetails> Users { get; set; } public string SharedPropertyOne { get; set; } public string SharedPropertyTwo { get; set; } } public class

在下面的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);
}
public class ShinyDTO
{
公共列表用户{get;set;}
公共字符串SharedPropertyOne{get;set;}
公共字符串SharedPropertyTwo{get;set;}
}
公共类用户详细信息
{
公共字符串标题{get;set;}
公共字符串名{get;set;}
公共字符串姓氏{get;set;}
}
公共类MyRealClass
{
公共字符串SharedPropertyOne{get;set;}
公共字符串SharedPropertyTwo{get;set;}
公共字符串标题{get;set;}
公共字符串名{get;set;}
公共字符串姓氏{get;set;}
}
//这将映射所有共享属性
MyRealClass请求=Mapper.Map(dto);
foreach(dto.Users中的var记录){
//这个位覆盖了上面设置的属性,然后我只为名字、姓氏等设置了属性。。。
请求=Mapper.Map(记录);
}
我需要将此映射到MyRealClass的列表中。我曾尝试创建单独的映射,然后在foreach中循环它,但这会不断删除初始属性

我还尝试设置第二个映射以忽略上面设置的属性,但我无法使其正常工作,它仍在覆盖属性

var autoMapperConfiguration = new MapperConfigurationExpression();
autoMapperConfiguration
            .CreateMap<MyRealClass, UserDetails>()
            .ForMember(c => c.SharedPropertyOne, d => d.Ignore())
            .ForMember(c => c.SharedPropertyTwo, d => d.Ignore());
var autoMapperConfiguration=new-MapperConfigurationExpression();
自动映射配置
.CreateMap()文件
.FormMember(c=>c.SharedPropertyOne,d=>d.Ignore())
.FormMember(c=>c.SharedPropertyTwo,d=>d.Ignore());

您可以在
UserDetails
IEnumerable
之间创建映射

var autoMapperConfiguration=new-MapperConfigurationExpression();
自动映射配置
.CreateMap()文件
.FormMember(dest=>dest.SharedPropertyOne,opt=>opt.MapFrom(x=>x.get(0.SharedPropertyOne))//您可以检查列表是否为空
.FormMember(dest=>dest.SharedPropertyTwo,opt=>opt.MapFrom(x=>x.get(0.SharedPropertyTwo))//您可以检查列表是否为空
.AfterMap((src,dest)=>//src是一种列表类型
{
foreach(src中的MyRealClass MyRealClass)
dest.Users.add(新用户详细信息(){
Title=myrealclass.Title,
Forename=myrealclass.Forename,
姓氏=myrealclass.姓氏
});
});

我想你很接近了,但你的问题是:

我需要将其映射到
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);
}
var autoMapperConfiguration=new-MapperConfigurationExpression();
autoMapperConfiguration.CreateMap();
autoMapperConfiguration.CreateMap();
var results=新列表();
foreach(dto.Users中的var记录){
var-mapped=Mapper.Map(dto);
Mapper.Map(记录,映射);
结果:添加(映射);
}
这里,第二个
Mapper.Map
调用将
记录
映射到
映射
,它不应该覆盖从
shinydo
映射到
MyRealClass
的映射已经映射的值


你也可以在
调用中使用
完成所有这些,但这对我来说似乎更清楚。

这就是我所需要的——你对映射的看法是正确的,这只是我手动键入的东西——没有复制和粘贴。我试图做mapped=Mapper.Map(记录,映射);重新分配它。
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);
}