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

How to prevent AutoMapper from initializing destination JObject member when source is null

假设您有以下 类:

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",所有这些都会导致 JsonConvert 返回 null),Destination.Data 的值最终被设置为空 JObject 而不是 null。

有没有办法完全阻止 Automapper 初始化目标成员?

您可以做一些不同的事情,但其中大多数只涵盖部分情况。例如,您可以向映射添加条件以仅在 Source.Data 不为 null 或为空时应用。但是如果 Source.Data 是字符串 "null".

则这不起作用

有没有更好的方法来处理这个而不需要在外面添加一堆特殊的外壳条件?

旁注:我可以通过提供字符串和 JObject 之间的顶级映射来使其工作。但这意味着我必须对每种情况使用相同的逻辑,我只希望它适用于这个 属性.

AllowNullCollections 适用于每个配置文件,但根据 属性,您可以尝试以下操作:

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

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