You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:32:03