我必须按以下步骤上课:
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属性,因此,如果这些属性不可为空,则没有默认值。
我可以选择其他解决方案。我没有想到一个好的解决方案。
答案 0 :(得分:1)
为什么需要忽略默认属性?
如果A.Item3
是默认的0值(因为从未将其设置为任何其他值),而您忽略了此属性的映射,则B.Item3
等于0(因为Automapper没有进行设置,因此B.Item3
具有默认的int值);这与Automapper实际上将默认值0从A.Item3
复制到B.Item3
时完全相同。
当您忽略默认属性时,您期望有什么不同?
在不同属性类型之间进行映射的情况下,可能有防止这种情况出现的原因,但是您发布的问题不包含此类示例。此外,在那种情况下,您通常总是不得不创建自定义映射,这使您不必为每个映射编写自定义代码的目的变得无法实现。