Automapper';s条件被忽略

Automapper';s条件被忽略,automapper,Automapper,问题 似乎这个条件被忽略了。以下是我的设想: 源类 public class Source { public IEnumerable<Enum1> Prop1{ get; set; } public IEnumerable<Enum2> Prop2{ get; set; } public IEnumerable<Enum3> Prop3{ get; set; } } public Enum1 Prop1 { get; se

问题 似乎这个条件被忽略了。以下是我的设想:

源类

public class Source
{
    public IEnumerable<Enum1> Prop1{ get; set; }

    public IEnumerable<Enum2> Prop2{ get; set; }

    public IEnumerable<Enum3> Prop3{ get; set; }
}
    public Enum1 Prop1 { get; set; }

    public Enum2 Prop2 { get; set; }

    public Enum3 Prop3 { get; set; }
自动映射

    Mapper.CreateMap<Source, Destination>()
            .ForMember(m => m.Prop1, o =>
                {
                    o.Condition(c => !c.IsSourceValueNull);
                    o.MapFrom(f => f.Prop1.Aggregate((current, next) => current | next));
                })
            .ForMember(m => m.Prop2, o =>
            {
                o.Condition(c => !c.IsSourceValueNull);
                o.MapFrom(f => f.Prop2.Aggregate((current, next) => current | next));
            })
            .ForMember(m => m.Prop3, o =>
            {
                o.Condition(c => !c.IsSourceValueNull);
                o.MapFrom(f => f.Prop3.Aggregate((current, next) => current | next));
            });  
我不确定IsSourceValueNull是在检查Prop1,还是实际的源类不是null。只有成员Prop1为空


非常感谢您的帮助。

我认为您需要分两步执行
条件
映射自

.ForMember(c => c.Prop1, o => o.Condition(c => !c.IsSourceValueNull));
.ForMember(c => c.Prop1, o => o.MapFrom(f => f.Prop1.Aggregate(...));
如果条件的计算结果为false,则永远不会使用MapFrom

编辑

嗯。。。这似乎不起作用。我想我以前在什么地方用过。您可以使用以下地图:

.MapFrom(f => f.Prop1 == null ? null : f.Prop1.Aggregate(...));

依我看,这实际上是AutoMapper的一个缺陷。上述条件语句应该可以正常工作。例如,当从一个具体类型映射到另一个具体类型时,将正确调用条件:

object mappedObject = !context.TypeMap.ShouldAssignValue(context) ? null : mapperToUse.Map(context, mapper);
这最终称为:


但是
EnumMapper
不会调用TypeMap的
ShouldAssignValue
方法来确定它是否应该映射该字段。类似地,我没有看到任何关于
AfterMap
的参考,因此这里定义的任何东西都不太可能起作用。

谢谢Patrick。我把这个分开,得到了完全相同的例外。我想我以前也这么做过。一种可能的情况是c.IsSourceValueNull可能表示要映射的整个源对象是否为null。我想知道它是否应该是“c=>c.Prop1!=null”?无法使用“条件”找到代码示例。很抱歉我想你总是可以这样做:o.MapFrom(f=>f.Prop1==null?null:f.Prop1.Aggregate(…)。这正是我所做的,而且很有效。奇怪的是,这种情况没有效果。如果你更新答案。我会核对一下你的回答。谢谢。@TimJohnson您需要使用前提条件而不是条件。在MapFrom之前对其进行评估。使用测试用例将其作为问题#143归档:
object mappedObject = !context.TypeMap.ShouldAssignValue(context) ? null : mapperToUse.Map(context, mapper);
    public bool ShouldAssignValue(ResolutionContext context)
    {
        return _condition == null || _condition(context);
    }