我有这些类(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));
希望这对遇到与我遇到的问题类似的人有帮助:)
关于c# - 如何使用自动映射器将源类型的父级映射到目标类型的集合中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20000229/