.net core 使用Automapper仅为每个属性创建附加条件副本

.net core 使用Automapper仅为每个属性创建附加条件副本,.net-core,automapper,.net Core,Automapper,我有两个相同类型的对象。我想使用Automapper有条件地将值从objectA复制到objectB(本质上是在相同类型的两个对象之间创建一个仅添加的副本)。我已经研究了条件映射和其他转换器类型,但我不想为对象的每个属性指定它。我想用完全相同的逻辑复制每个属性 如果源属性为NULL,则不要复制 如果目标已具有值,则不要复制 如果目标为空,则从源复制 如果源属性和目标属性都是列表,则仅将缺少的项添加到目标列表中,因为目标可能有不在源列表中的项需要保留 我知道我可以通过为每个属性指定这些规则来创

我有两个相同类型的对象。我想使用Automapper有条件地将值从objectA复制到objectB(本质上是在相同类型的两个对象之间创建一个仅添加的副本)。我已经研究了条件映射和其他转换器类型,但我不想为对象的每个属性指定它。我想用完全相同的逻辑复制每个属性

  • 如果源属性为NULL,则不要复制
  • 如果目标已具有值,则不要复制
  • 如果目标为空,则从源复制
  • 如果源属性和目标属性都是列表,则仅将缺少的项添加到目标列表中,因为目标可能有不在源列表中的项需要保留
我知道我可以通过为每个属性指定这些规则来创建配置,但我想知道是否可以为映射的每个属性全局定义这些规则,以便我可以创建此映射配置的通用版本

我觉得我所需要的是能够指定一个func,其中automapper同时传递源值和目标值,并且我可以使用上述逻辑简单地基于它们之间的相等性做出决定

    public static TOutput CopyAll<TInput, TOutput>(TInput input, TOutput output)
    {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<TInput, TOutput>().ForAllMembers(o => o.Condition((src, dest, srcValue, destValue) =>
            {
                return (srcValue != null && destValue == null);
            }));
        });

        IMapper mapper = config.CreateMapper();

        return mapper.Map<TInput, TOutput>(input, output);
    }
publicstatictoutput CopyAll(TInput输入,TOutput输出)
{
var config=new-MapperConfiguration(cfg=>
{
cfg.CreateMap().ForAllMembers(o=>o.Condition((src,dest,srcValue,destValue)=>
{
返回(srcValue!=null&&destValue==null);
}));
});
IMapper mapper=config.CreateMapper();
返回mapper.Map(输入、输出);
}

对所有成员和条件映射进行研究。这非常有效,Lucian。我仍在试图弄清楚如何将objectA中属于列表类型的属性中的项复制到objectB中的现有列表中,以便只添加新项(而不是删除列表中仅存在于objectB中的项)。映射到现有集合时,首先清除目标集合。如果这不是您想要的,请查看AutoMapper.Collection.Yea,我不希望清除此集合。一些基本选项在映射缺少的项之前无法清除。我来看看AutoMapper.Collection,但它实际上删除了现有集合中不在源代码中的项。需要选择不删除。