我正在使用 C# 的 Automapper 将通过 API 接收的 xml 对象映射到 C# 模型。 与通过同一端点接收的其他 xml 数据相比,接收到的 xml 可能具有也可能不具有相同的属性。 (示例:一组数据将包含名字、中间名、姓氏,而另一组数据将包含名字、姓氏和后缀)
我知道简单的解决方案是合并 xml 并提供 xml 属性,即使该值什么也没有,但我无权访问正在创建或发送数据的内容。
当前,当尝试映射此示例时,如果映射器尝试映射此部分并且发现中间名或后缀属性不存在,它将完全使整个对象无效,而不是仅将此字段设置为空或空白。
(下面的代码是我无法分享的工作项目代码的简化版本)
public class Person
{
public PersonName? PersonName { get; set; }
}
public class PersonName
{
public string? PersonFirstName { get; set; }
public string? PersonMiddleName { get; set; }
public string? PersonLastName { get; set; }
public string? PersonSuffix { get; set; }
}
CreateMap<XMLData, Person>()
.ForMember(dest => dest.Person, opt => opt.MapFrom(
(src => new Person {
PersonName = new PersonName {
PersonFirstName = src.PersonFirstName.Value,
PersonMiddleName = src.PersonMiddleName.Value,
PersonLastName = src.PersonLastName.Value,
PersonSuffix = src.PersonSuffix.Value,
}
})));
我开始尝试创建一个自定义值解析器,并且我仍然致力于将其作为一种方法。它似乎太复杂了,我希望看看是否有一种我可能错过的更简单的方法。
您应该寻找自定义类型解析器。
在您的映射配置文件中,它应该包含 2 个映射规则:
XMLData
到Person
的地图。XMLData
到PersonName
CreateMap<XMLData, Person>()
.ConvertUsing((src, dest, context) =>
{
dest = new Person();
dest.PersonName = context.Mapper.Map<PersonName>(src);
return dest;
});
CreateMap<XMLData, PersonName>();