Automapper的条件被忽略

时间:2011-11-04 16:38:29

标签: automapper

问题 似乎条件被忽略了。这是我的情景:

来源类

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

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

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

enums子类来自一个字节,并用[Flags]修饰。目标类只包含Enum1,Enum2和Enum3等属性,包含&#34; total&#34;按位值。因此,如果Enumeration包含Enum1.value!,Enum1.Value2和Enum1.Value3,则在本构中,目标将包含Enum1.Value1的按位值。 Enum1.Value2 | Enum1.Value3

目的地类

    public Enum1 Prop1 { get; set; }

    public Enum2 Prop2 { get; set; }

    public Enum3 Prop3 { get; set; }

AutoMapper Mapping

    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));
            });  

当内部属性不为null并且映射成功并正确设置目标时,映射可以正常工作。但是,我想在成员源值为null时跳过映射(当Prop1为null时,然后跳过映射)。

我可以从调试中看到Source.Prop1为null。条件被完全忽略并获得异常,表示该值为null。

Trying to map Source to Destination. Destination property: Prop1. Exception of type 'AutoMapper.AutoMapperMappingException' was thrown. --> Value cannot be null. Parameter name: source

我不确定IsSourceValueNull是否检查Prop1或实际的Source类是否为null。只有成员Prop1为空。

任何帮助都会得到赞赏。

2 个答案:

答案 0 :(得分:7)

我认为您需要分两步执行ConditionMapFrom

.ForMember(c => c.Prop1, o => o.Condition(c => !c.IsSourceValueNull));
.ForMember(c => c.Prop1, o => o.MapFrom(f => f.Prop1.Aggregate(...));

如果Condition的计算结果为false,则永远不会使用MapFrom。

修改

嗯......这似乎不起作用。我以为我曾经在某个地方使用过它。您可以使用MapFrom:

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

答案 1 :(得分:2)

IMO,这实际上是AutoMapper的EnumMapper中的一个错误。如上所述,条件语句应该可以正常工作。例如,当从一种具体类型映射到另一种具体类型时,TypeMapMapper将正确调用条件:

object mappedObject = !context.TypeMap.ShouldAssignValue(context) ? null : mapperToUse.Map(context, mapper);

最终调用defined condition

    public bool ShouldAssignValue(ResolutionContext context)
    {
        return _condition == null || _condition(context);
    }

但是EnumMapper没有调用TypeMap的ShouldAssignValue方法来确定它是否应该映射该字段。同样,我没有看到任何对AfterMap的引用,因此不太可能在那里定义的任何内容也不会起作用。