AutoMapper 8.0.0:如果属性具有默认值,如何忽略映射?

时间:2019-02-06 12:46:48

标签: c# automapper

我必须按以下步骤上课:

public class ClassA
{
    public string Item1 { get; set; } // null
    public string Item2 { get; set; } // "This is not null."
    public int Item3 { get; set; } // 0
    public int Item4 { get; set; } // 1 (greater then 0)
}

public class ClassB
{
    public string Item1 { get; set; }
    public string Item2 { get; set; }
    public int Item3 { get; set; }
    public int Item4 { get; set; }
}

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<ClassA, ClassB>();
    }
}

我想忽略在ClassA中哪些属性具有默认值的映射。

我的项目中有很多这样的类,所以我不想分别忽略每个属性。我需要一个全局配置。

我读了很多样本​​,花了5个小时来做​​。我尝试使用ForAllMembers,但我做不到。

做到这一点的最佳方法是什么?

编辑1:

我需要那种东西?

我正在使用DevExtreme Grid,并且正在网格上使用编辑弹出窗口。在弹出窗口中,仅更改两个属性并保存。我在“ values”变量上得到了as json字符串,例如示例。

ClassA是一个视图模型,具有验证属性。 ClassB是一个实体。

JsonConvert.PopulateObject(values,viewModel);我可以将json字符串映射到ClassA。没关系。但是其他属性(Item1和Item3)仍然具有默认值。这就是为什么我要忽略具有默认值的属性的原因。

    [HttpPut]
    public IActionResult DxUpdate(int key, string values)
    {
        /*
            values example:
            {"item2":"This is not null.","item4":1}
         */

        var entity = _service.GetById(...);

        var viewModel = new ClassA();

        JsonConvert.PopulateObject(values, viewModel);

        if (!TryValidateModel(viewModel))
            return BadRequest(ModelState.GetFullErrorMessage());

        entity = _mapper.Map<ClassB>(viewModel);

        _service.Update(entity);

        return Ok();
    }

编辑2:

ClassA具有可为空的int或double属性,因此,如果这些属性不可为空,则没有默认值。

我可以选择其他解决方案。我没有想到一个好的解决方案。

1 个答案:

答案 0 :(得分:1)

为什么需要忽略默认属性?

如果A.Item3是默认的0值(因为从未将其设置为任何其他值),而您忽略了此属性的映射,则B.Item3等于0(因为Automapper没有进行设置,因此B.Item3具有默认的int值);这与Automapper实际上将默认值0从A.Item3复制到B.Item3时完全相同。

当您忽略默认属性时,您期望有什么不同?

在不同属性类型之间进行映射的情况下,可能有防止这种情况出现的原因,但是您发布的问题不包含此类示例。此外,在那种情况下,您通常总是不得不创建自定义映射,这使您不必为每个映射编写自定义代码的目的变得无法实现。