Automapper 8使用参数作为映射条件

时间:2019-03-13 18:20:50

标签: .net automapper automapper-8

我当前正在使用Automapper 8.0,并试图将参数作为映射条件传递给映射器。

我正在映射两个包含另一个对象的IEnumerable的对象。例如...

public class Source {
   public IEnumerable<SourceIE> value {get; set;}
}

public class SourceIE
{
   public long Id { get; set; }
   public string Name { get; set; }
   public number Rating { get; set; }
}

public class Destination {
   public <IEnumerable>DestinationIE value {get; set;}
}

public class DestinationIE
{
   public long ID { get; set; }
   public string Name { get; set; }
   public number Rating { get; set; }
}

我为根对象设置了自动映射器,以忽略我的子文档,然后为我的子文档创建了一个新的映射器,如下所示:

    var mapped = _mapper.Map<IEnumerable<Destination>>
        (data, opt => opt.Items.Add("ShowStarRating", false));

在映射器内部,我试图设置一个条件,以便仅在ShowStarRating = true时才会映射Rating。

.ForMember(dest => dest.Rating, opt =>
    {
    opt.Condition(context=>
        {
            return (bool)context.Options.Items["ShowStarRating"];
        }
    );
    opt.MapFrom(src => src.Rating);
    }
);

我遇到的这个问题是无法识别选项,当我将鼠标悬停时,它说“源”不包含“选项”的定义并且没有可访问的扩展方法。

我一生都不知道如何从Condition内部访问传入的Options.Items值。在Automapper 5或更低版本中,似乎有大量有关如何执行此操作的信息,但对于8则没有。

1 个答案:

答案 0 :(得分:0)

经过一堆反复试验后,我得以弄清楚这一点。事实证明,上下文是条件中的第四项,因此我只需要在阅读它之前就可以弄懂它。

.ForMember(dest => dest.Rating, 
    opt => opt.Condition(
        (src, dest, x, y, context) => context.Options.Items["ShowStarRating"] == "true"
    )
);