如何配置AutoMapper忽略字典转类时的不支持属性映射?
如何配置AutoMapper忽略Dictionary转强类型时的转换失败项?
我需要将Dictionary<string, object>类型的动态对象转换为强类型类,AutoMapper默认支持这种转换,无需创建显式映射。但AutoMapper在遇到字典键与目标类属性名匹配但转换失败时,会直接抛出异常。
现在希望配置Mapper,仅映射字典中可成功转换的项,无法转换的项保留目标类的默认值。比如下面的示例中,当把date_from的值改为无效日期格式"2023-11-27xxx"时,希望date_from属性保留默认值而非抛出异常:
public class Sample1 { public string str_number { get; set; } public string description { get; set; } public DateTime date_from { get; set; } } var dynamicItems = new Dictionary<string, object> { ["str_number"] = 123456, ["description"] = "lorem ipsum", ["date_from"] = "2023-11-27" }; var mapperConf = new MapperConfiguration(cfg => {}); var mapper = new Mapper(mapperConf); var result = mapper.Map<Sample1>(dynamicItems);
已实现的解决方案(基于Newtonsoft.Json)
我通过Newtonsoft.Json包的序列化机制实现了需求,利用JsonSerializerSettings中的错误处理程序,可忽略转换失败的属性,仅设置可转换的属性,其余保留默认值:
private static T Convert<T>(IDictionary<string, object> cmProperties) where T : class, new() { // 忽略无法转换为目标类型的属性 var settings = new JsonSerializerSettings { Error = (_, eventArgs) => { eventArgs.ErrorContext.Handled = true; } }; // 将字典序列化为JSON字符串 var json = JsonConvert.SerializeObject(cmProperties); // 将JSON反序列化为强类型对象,若反序列化失败则返回空实例 return JsonConvert.DeserializeObject<T>(json, settings) ?? new T(); }
内容的提问来源于stack exchange,提问作者Ondrej
相关产品推荐
相关产品推荐

