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