3

我想设置一个遵循以下规则的 Automapper 映射。

  • 如果未使用“就地”目标语法,则将特定成员映射到值
  • 如果传入一个对象,则使用目标值

我已经尝试了所有我能想到的方法。像这样的东西:

Mapper.CreateMap<A, B>()
    .ForMember(dest => dest.RowCreatedDateTime, opt => {
        opt.Condition(dest => dest.DestinationValue == null);
        opt.UseValue(DateTime.Now);
     });

这总是映射值。基本上我想要的是:

c = Mapper.Map<A, B>(a, b);  // does not overwrite the existing b.RowCreatedDateTime
c = Mapper.Map<B>(a);        // uses DateTime.Now for c.RowCreatedDateTime

注意:A 不包含 RowCreatedDateTime。

我在这里有什么选择?这非常令人沮丧,因为似乎没有关于 Condition 方法的文档,并且所有谷歌结果似乎都集中在源值为 null 的位置,而不是目标位置。

编辑:

多亏了帕特里克,他让我走上了正轨。

我想出了一个解决办法。如果有人有更好的方法,请告诉我。注意我必须引用dest.Parent.DestinationValue而不是dest.DestinationValue. 出于某种原因,dest.DestinationValue始终为空。

.ForMember(d => d.RowCreatedDateTime, o => o.Condition(d => dest.Parent.DestinationValue != null))
.ForMember(d => d.RowCreatedDateTime, o => o.UseValue(DateTime.Now))
4

1 回答 1

4

我相信您需要设置两个映射:一个带有Condition(确定是否应该执行映射)和一个定义如果Condition返回 true 时要做什么。像这样的东西:

.ForMember(d => d.RowCreatedDateTime, o => o.Condition(d => d.DestinationValue == null);
.ForMember(d => d.RowCreatedDateTime, o => o.UseValue(DateTime.Now));
于 2012-09-14T12:32:10.657 回答