如何防止AutoMapper在源为null时初始化目标JObject成员

3
假设你有以下类:
public class Source
{
    public string Data { get; set; }
}

public class Destination
{
    public JObject Data { get; set; }
}

你可以使用以下方法配置AutoMapper:

Mapper.Initialize(
    cfg =>
    {
        cfg.CreateMap<Source, Destination>()
            .ForMember(
                d => d.Data, 
                c => c.MapFrom(s => JsonConvert.DeserializeObject(s.Data ?? "")
    }
);

当您使用Data的值映射一个Source对象时,如果结果是空的json(例如,一个null值、一个空字符串或字符串"null",所有这些都导致JsonConvert返回null),则Destination.Data的值最终被设置为空的JObject而不是null。
有没有一种方法可以防止Automapper完全初始化目标成员?
有几种不同的方法,但它们大多数只涵盖了一部分情况。例如,您可以添加一个条件到映射中,仅在Source.Data不为null或空时应用。但如果Source.Data是字符串"null",这种方法就不起作用了。
有没有更好的方法可以处理这个问题,而不需要在外部添加大量特殊的条件呢?
附注:我可以通过提供一个顶级映射来使其工作,将string映射到JObject。但这意味着我必须对每种情况使用相同的逻辑,并且我只希望它适用于这一个属性。
1个回答

0

AllowNullCollections按配置文件工作,但按属性,您可以尝试这样做:

cfg.CreateMap<Source, Destination>()
   .ForMember(destination => destination.Data, 
              options => options.AddTransform(data=>data.Count == 0 ? null : data));

问题是,你解决的东西会再次映射,如果AllowNullCollections为false,AM将不得不为你创建一个 :) 另请参见this

“AllowNullCollections” 看起来可以实现我所希望的功能。我认为这可以按照个人资料进行设置,因为在这种情况下我仍然可以根据每个成员自定义转换。我想避免使用转换选项,因为数据为空对象是有效的,不应该被置空。 - Ben Randall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接