如何使用AutoMapper将构造函数参数传递给隐式Dictionary映射?

时间:2019-01-23 22:28:12

标签: c# automapper

假设我有一个TestClassTestClassModel的映射。

在没有声明任何其他映射的情况下,我已经可以将Dictionary<string,TestClass>映射到Dictionary<string,TestClassModel>

想象一下Dictionary<string,TestClass>已使用new Dictionary<string,TestClass>(StringComparer.OrdinalIgnoreCase)进行了初始化。这允许不区分大小写的查找。

如何在映射的Dictionary中保留StringComparer.OrdinalIgnoreCase构造函数参数?我尝试使用.ForCtorParam进行显式的Dictionary-> Dictionary映射,但这只会导致目标字典为空(因为您随后必须添加KeyValuePair映射。)

提琴:https://dotnetfiddle.net/KYQNWT

1 个答案:

答案 0 :(得分:1)

我确实可以使用它,但是不确定为什么它在DotNetFiddle上不起作用。如果我在自己的应用中运行它,则效果很好。我留下了其他我测试过的东西。

  Mapper.Initialize(cfg =>
  {
    cfg.CreateMap<TestClass, TestClassModel>()
      .ForMember(d => d._F1, s => s.MapFrom(o => o.F1));

    cfg.CreateMap<KeyValuePair<string, TestClass>, KeyValuePair<string, TestClassModel>>()
      .ConstructUsing(x => new KeyValuePair<string, TestClassModel>(x.Key, Mapper.Map<TestClassModel>(x.Value)));

    cfg.CreateMap(typeof(Dictionary<,>), typeof(Dictionary<string, TestClassModel>))
      //.ForCtorParam("collection", opt => opt.MapFrom(src => Mapper.Map<IEnumerable<KeyValuePair<string, TestClassModel>>>(src)))
      //.ForCtorParam("comparer", opt => opt.MapFrom(src => StringComparer.OrdinalIgnoreCase));
      .ConstructUsing(src => new Dictionary<string, TestClassModel>(Mapper.Map<IEnumerable<KeyValuePair<string, TestClassModel>>>(src), StringComparer.OrdinalIgnoreCase));
  });

如果要在任何类型的实际环境中运行此程序,我强烈建议使用instanced type of automapper