Skip to main content
 首页 » 编程设计

c#之如何使用自动映射器将源类型的父级映射到目标类型的集合中

2024年02月13日29tuyile006

我有这些类(class):

public class Source  
{ 
    public string ID { get; set; } 
    public int Age Name { get; set; } 
    public virtual ICollection<SourceChild> SourceChildren { get; set; } 
} 
 
public class SourceChild  
{ 
    public string Name { get; set; } 
    public string Language { get; set; } 
    public string SourceId { get; set; } 
    public virtual Source Source { get; set; } 
} 
 
public class Destination 
{ 
    public int Age { get; set; } 
    public string Name { get; set; } 
    public string Language { get; set; } 
    public string Id { get; set; } 
} 

我使用这些映射来映射这些类:

        Mapper.CreateMap<SourceChild, Destination>() 
            .ForMember(item => item.ID, property => property.MapFrom(item => item.SourceId)) 
            .ForMember(item => item.Age, property => property.MapFrom(item => item.Source.Age)); 

Automapper 自动映射其他两个属性。因此,如果我尝试将 SourceChild 映射到 Destination 类型,一切正常。但是现在我有另一个使用源和目标类型的类:

public class SourceUser  
{ 
    public string ID { get; set; } 
    public virtual Source Source { get; set; } 
} 
 
public class DestinationUser 
{ 
    public string Id { get; set; } 
    public List<Destination> Destinations { get; set; }  
} 

为了更好地说明情况,这里是对类的简短描述:我有 Source 对象和 SourceChild 子对象。 SourceChild 对象包含不同语言的信息。当我将 Source 映射到 Destination 时,我想输入 Source 对象并接收目标对象集合的输出。对于每个 SourceChild 对象,Source 对象,应该有一个 Destination 对象。SourceUser 只是指 Source 具有一对多关系。 DestinationUser 与 Destination 类有很多关系。换句话说,每个 DestinationUser 都有一个包含所有语言的所有 Destinations 的列表。考虑到所有这些,让我们回到代码。

我在编写我需要的代码时运气不错。我想出了这个:

 Mapper.CreateMap<SourceUser, DestinationUser>() 
                .AfterMap((source, destination) => Mapper.Map<Source, List<Destination>>(source.Source)); 
 
    Mapper.CreateMap<Source, List<Destination>>() 
                    .AfterMap((source, destination) => Mapper.Map<List<SourceChild>, List<Destination>>(source.SourceChildren.ToList(), destination)); 

这几乎可以正常工作,但有一个 IF。我正在使用可查询扩展来处理映射。当我检索 DestinationUsers 的集合时,它们都没有映射属性 Destinations。它显示为空。但是,如果我像这样手动进行映射:

SourceUser SourceUser = Db.GetSourceUser(); 
DestinationUser DestUser = Db.GetDestinationUser(); 
DestUser.Destinations = Mapper.Map<List<Destination>>(SourceUser.Source); 

一切正常。 DestinationUsers 的列表是从 Source 的实例映射而来的。

是否可以避免手动调用后面的 Mapper.Map() 调用?另请记住,List Destinations 可能会更改为任何其他集合。我只想为每个 SourceChild 对象 Source 拥有一个 Destination 对象。

请您参考如下方法:

事实证明,我距离我所追求的解决方案只有一小步之遥。我所需要的只是扩展我的 SourceUser 和 DestinationUser 类的映射,使其看起来像这样:

Mapper.CreateMap<SourceUser, DestinationUser>() 
                .AfterMap((source, destination) => Mapper.Map<Source, List<Destination>>(source.Source, destination.Destinations)); 

希望这对遇到与我遇到的问题类似的人有帮助:)