我有一个案例可以简化为:
public class ASource
{
public string ID { get; set; }
public virtual BSource B { get; set }
}
public class BSource
{
public string ID { get; set; }
}
public class ADestination
{
public string ID { get; set; }
public virtual BDestination B { get; set }
}
public class BDestination
{
public string ID { get; set; }
public bool Used { get; set; }
}
Mapper.Map<BSource, BDestination>()
.ForMember(item => item.Used, property => property.MapFrom(item => item.ID.Contains("Used")));
Mapper.Map<ASource, ADesctination>();
如果在映射ASource =&gt;时发生映射,如何强制automapper忽略映射BDestination.Used属性? ADestination?映射BSource =&gt;时BDestination我希望按照映射配置中的说明映射属性。
使用AfterMpa()方法来实现这不是一个解决方案 - 我使用的是可查询的扩展,它不适用于AfterMap()
答案 0 :(得分:0)
您可以尝试:
Mapper.Map<BSource, BDestination>()
.ForMember(item => item.Used,
property => property.MapFrom(item => item.ID.Contains("Used")))
.Ignore(source => source.theFieldYouWantToIgnore);
答案 1 :(得分:0)
我唯一能想到的是
Mapper.CreateMap<ASource,ADestination>()
.ForMember(adest => adest.B,
m => m.MapFrom(asrc => new BSource { ID = asrc.B.ID }) );
因此,您从没有BSource
属性集的临时Used
映射。当然,这不是太优雅,尤其是不是BSource
有很多属性的时候。此外,我从不喜欢这些“脏”映射,因为大多数时候它们会影响不可见的代码。配置(一般情况下)不应控制程序流程。
我想我会保持简单并创建第二个BDestination
类,以便在ADestination
中使用。但我不知道您的代码中是否存在问题,因为您可能需要交替使用BDestination
个对象(来自A
或不来)。
答案 2 :(得分:0)
你需要做几件事:
Mapper.CreateMap<ASource, ADestination>()
.AfterMap((src, dest) => { dest.B.Used = false; });
Mapper.CreateMap<BSource, BDestination>()
.ForMember(dest => dest.Used, opt => src.ID.Contains("Used"));
因此,您将值默认为“false”,但是在映射了ASource之后 - &gt; ADestination,您填写子属性的“已使用”值。此AfterMap仅针对ASource / ADestination映射执行。
但是,这不适用于可查询扩展。基于映射入口点构建不同的表达式树现在有点过于复杂。