在下面的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。看来您实际上想要的是从UserDetailsMyRealClass的映射。

无论如何,这是完成此操作的一种方法:

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,并且它不应覆盖从ShinyDTOMyRealClass的映射已经映射的值。

您也可以看中并在ConstructUsing调用中完成所有这些操作,但这对我来说似乎很清楚。

10-07 18:32