AutoMapper C#-为目标中所有未映射的字符串设置默认值

时间:2019-02-20 15:16:49

标签: c# automapper

我是AutoMapper的新手,正在尝试将对象转换为更大(意味着更多字段)的对象。 我正在寻找一种为所有目的地的字符串字段设置默认值的方法。 当前找不到为所有字符串字段定义一般条件的方法。

假设:

  class A
{
    public string a { get; set; }

}

class B
{
    public DateTime DateTime { get; set; }
    public string a { get; set; }
    public string b { get; set; }
    public string c { get; set; }
}

然后在使用映射器时:

var config = new MapperConfiguration(cfg => cfg.CreateMap<A, B>());       
            var mapper = config.CreateMapper();
            B map = mapper.Map<B>(new A {a = "f"});

未映射的字符串的值为null。 我正在寻找一种将未映射的字符串设置为string.Empty的方法。 使用config.ForAllMembers(...)。 注意:我知道我可以为每个字段使用特定的ForMember,例如:

 var config = new MapperConfiguration(cfg => cfg.CreateMap<A, B>()
           .ForMember(des => des.b, x=> x.MapFrom(src => string.Empty)));       

但这不是很好。为什么?

  1. 有时我的字段不能保证其值,它可以为null或 有效值,因此在这种情况下我需要注意。
  2. 在实际情况下,我有很多字段,因此为每个字段定义这样的规则并不是一个舒适的解决方案。

有这样一种简单的解决方案吗?

2 个答案:

答案 0 :(得分:0)

一个想法是使用ForAllOtherMembers。

    c.CreateMap<A, B>().ForAllOtherMembers(o=>
    {
        if(((PropertyInfo)o.DestinationMember).PropertyType == typeof(string))
        {
            o.MapFrom(s=>"default");
        }
    });

答案 1 :(得分:0)

我设法通过以下方式解决:

.ForMember(dest => dest.field, act => act.MapFrom(src => String.IsNullOrEmpty(src.field) ? "N/A" : src.field))