AutoMapper 8.0.0:如何忽略if属性具有默认值的映射



我必须按如下方式分类:

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网格,我正在使用网格上的编辑弹出窗口。在弹出窗口中,只更改了两个属性并保存。我得到了"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具有可为null的int或double属性,因此如果这些属性不可为null,则没有默认值。

我同意另一种解决方案。我想不出一个好的解决办法。

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

如果A.Item3是默认的0值(因为它从未设置为任何其他值),并且忽略此属性的映射,则B.Item3等于0(因为Automapper没有设置它,因此B.Item3具有默认的int值);这与Automapper实际上将默认值0从CCD_ 4复制到CCD_。

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

在不同属性类型之间进行映射的情况下,可能有理由防止这种情况发生,但您发布的问题不包含这样的示例。此外,在这些情况下,您通常不得不创建自定义映射,这违背了您不必为每个映射编写自定义代码的目的。

最新更新