当源为空时如何防止 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。
假设您有以下 类:
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。