c# - 当源为空时如何防止 AutoMapper 初始化目标 JObject 成员
问题描述
假设您有以下类:
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 ?? "")
}
);
当您将一个Source
对象映射为一个Data
导致 null json 的值(例如,一个 null 值、一个空字符串或字符串“null”,所有这些都会导致 JsonConvert 返回 null),最终的值Destination.Data
被设置为空 JObject 而不是 null。
有没有办法阻止 Automapper 初始化目标成员?
您可以做一些不同的事情,但其中大多数只涵盖部分案例。例如,您可以向映射添加条件以仅在Source.Data
不为空或不为空时应用。Source.Data
但如果是字符串“null”,这将不起作用。
有没有更好的方法来处理这个而不需要在外面添加一堆特殊的套管条件?
旁注:我可以通过提供字符串和 JObject 之间的顶级映射来使其工作。但这意味着我必须对每种情况使用相同的逻辑,并且我只希望它适用于这个属性。
解决方案
AllowNullCollections 适用于每个配置文件,但每个属性,您可以尝试如下:
cfg.CreateMap<Source, Destination>()
.ForMember(destination => destination.Data,
options => options.AddTransform(data=>data.Count == 0 ? null : data));
问题是,您解决的问题会再次映射,如果 AllowNullCollections 为假,AM 将不得不为您创建一个 :) 另请参阅此。
推荐阅读
- css - Divi:自定义菜单项无法正常工作(文本颜色)
- git - 请求因错误而超时:RPC 失败;curl 18 传输已关闭,剩余未完成的读取数据
- python-3.x - Odoo:第二次创建项目截止日期时出错
- json - Azure Powershell - 部署模板验证失败 - Jtoken
- python-3.x - 如何通过python中的递归获取父节点?
- groovy - 找到匹配时从每个循环中中断
- javascript - Angular agGrid - 是否可以将 rowSelection 事件传递给 cellRenderer?
- postgresql - 覆盖现有 postgis 表时出现扭结物化视图的问题
- azure-pipelines - 相对于每个构建或每个管道的预定义变量 ArtifactStagingDirectory 位置?
- c++ - GLSL Sphere - 射线相交几何解