我必须按如下方式分类:
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_。
当您忽略默认属性时,您希望有什么不同?
在不同属性类型之间进行映射的情况下,可能有理由防止这种情况发生,但您发布的问题不包含这样的示例。此外,在这些情况下,您通常不得不创建自定义映射,这违背了您不必为每个映射编写自定义代码的目的。