AutoMapper在映射列表时忽略属性

时间:2013-10-16 14:57:49

标签: c# automapper

在映射列表时,AutoMapper是否可以忽略某些属性? 例如,我有两个类Metadata和MetadataInput。

两者都有相同的字段,除了目标,“MetadataInput”,它有一个额外的字段。

Mapper.CreateMap <IList<Metadata>, IList<MetadataInput>>()

我尝试使用formember选项,但它会产生错误,可能是因为当您要映射列表时无法使用该属性?如果是,是否有替代解决方案?

4 个答案:

答案 0 :(得分:1)

正如Darin Dimitrov所建议的那样,你不应该尝试映射列表或集合。

如果您有1 - &gt;他们之间的关系,只需制作如下地图:

Mapper.CreateMap<Metadata, MetadataInput>().ForMember(s => s.Property, t => t.Ignore());

然后你可以使用你的列表并将其选择到另一个列表。

var metadataList = new List<Metadata>();

var meatadataInputList = metadataList.Select(p => Mapper.Map<MetadataInput>(p).ToList();

答案 1 :(得分:0)

感谢您提供有用的评论。 因为两个列表都已在映射之前完成,所以我已经这样做了:

从db:

获取列表
List<Metadata> metadatas = _Metadataservice.GetList(_Collectionservice.Get("Koekelare").ID).ToList();

创建映射器(感谢指出我的错误):

Mapper.CreateMap<Metadata, MetadataInput>().ForMember(s => s.Property, t => t.Ignore());

制作新列表并逐个映射新(单个)值:

List<MetadataInput> meta = new List<MetadataInput>();
for (int i = 0; i < e.Count; i++)
{
  meta.Add(Mapper.Map<Metadata, MetadataInput>(metadatas[i], input.Metadatas[i]));
}

有人可以证实这是一个好方法吗?

答案 2 :(得分:0)

使用此映射器配置获得所需的结果:

numpy

答案 3 :(得分:0)

正如其他人所建议的,我们应该避免映射列表和集合。为了忽略所有未映射的属性,请为我解决以下问题。

 CreateMap<Metadata, MetadataInput>()
        .ForMember(dest => dest.Id, o => o.MapFrom(src => src.sourceIdentifier))
        .ForMember(dest => dest.Name, o => o.MapFrom(src => src.sourceName))
        .ForAllOtherMembers(opts => opts.Ignore());

ForAllOtherMembers应该是方法链中的最后一个。