如何在 AutoMapper 中跳过/设置为 null 属性

问题描述 投票:0回答:1

我正在使用 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,
        }       
    })));

我开始尝试创建一个自定义值解析器,并且我仍然致力于将其作为一种方法。它似乎太复杂了,我希望看看是否有一种我可能错过的更简单的方法。

c# api automapper
1个回答
0
投票

您应该寻找自定义类型解析器

在您的映射配置文件中,它应该包含 2 个映射规则:

  1. XMLData
    Person
    的地图。
  2. XMLData
    PersonName
  3. 的地图
CreateMap<XMLData, Person>()
    .ConvertUsing((src, dest, context) =>
    {
        dest = new Person();
        dest.PersonName = context.Mapper.Map<PersonName>(src);
                                                                                      
        return dest;
    });
                                                                  
CreateMap<XMLData, PersonName>();
© www.soinside.com 2019 - 2024. All rights reserved.