【问题标题】:c# automapper dictionary to dictionary [duplicate]c# automapper字典到字典[重复]
【发布时间】:2019-02-22 22:16:01
【问题描述】:

我正在尝试将 Superhero 模型自动映射到 Supervillan 模型,每个模型都有类似的字典声明:

超级英雄

public class Superheroes {
    public Dictionary<string, SomeHero>> SuperNumber {get; set;}
}

public class SomeHero {
 // unique properties
}

超级反派

public class Supervillans {
    public Dictionary<string, SomeVillan>> SuperNumber {get; set;}
}

public class SomeVillan {
 // unique properties
}

我尝试按照其他类似主题中的建议进行操作,但没有成功。这是我最新的尝试,但执行失败:

CreateMap<KeyValuePair<string, Superheroes>, KeyValuePair<string, Supervillans>>(); 

如何将我的 Superhero SuperNumber 字典映射到我的 Supervillan SuperNumber 字典?

注意:SomeHero/SomeVillan 模型将具有独特的属性,但我不关心这个问题。

【问题讨论】:

  • 您还需要来自Superheroes Supervillans 的映射来定义其转换方式
  • 您可能应该考虑升级您的 Automapper 版本,我相信这已在版本 6+ Example 中得到修复。
  • 感谢@ErikPhilips 的示例,我会检查我的版本。

标签: c# dictionary automapper


【解决方案1】:

它应该开箱即用。字典不需要显式配置映射:Dynamic and ExpandoObjects。如果属性与我的示例相同,则类也相同。

public class ObjA
{ 
    public string Name { get; set; }
}

public class ObjB
{
    public string Name { get; set; }
}

public class ClassA
{
    public Dictionary<string, ObjA> Vals { get; set; } = new Dictionary<string, ObjA>{
        {"a", new ObjA(){ Name = "A", } },
        {"b", new ObjA(){ Name = "B", } },
        {"c", new ObjA(){ Name = "C", } },
        {"d", new ObjA(){ Name = "D", } },
    };
}

public class ClassB
{
    public Dictionary<string, ObjB> Vals { get; set; } = new Dictionary<string, ObjB>{
        {"a", new ObjB(){ Name = "A", } },
        {"b", new ObjB(){ Name = "B", } },
        {"c", new ObjB(){ Name = "C", } },
        {"d", new ObjB(){ Name = "D", } },
    };
}

如果您随后使用下面的自动映射器,映射应该会自动工作。

var obja = new ClassA();
var objb = new ClassB();
var config = new MapperConfiguration(cfg => {});
var mapper = config.CreateMapper();
var obj = mapper.Map<ClassB>(obja);
var obj2 = mapper.Map<ClassA>(objb);

如果你想硬编码类的映射,应该这样做:

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<ClassA, ClassB>().ReverseMap();
});

【讨论】:

  • 它不能开箱即用,因为KeyValuePair 没有无参数构造函数,并且KeyValue 都没有设置器。 (取决于 AutoMapper 版本)。
  • @ErikPhilips 从 2011 年开始,这个问题的答案现在很愚蠢,从那时起已经有很多 AM 版本,因此将问题标记为重复对任何人都没有帮助,相反。
  • @ErikPhilips 想支持上面的评论,我尝试了以前的解决方案,此时它们似乎都过时了。这个答案提供了一个真实的、更新的解决方案,它实际上对我有用。请注意,我的问题尝试了“原始”问题解决方案,这对我不起作用(可能是我的错)。请重新考虑。
猜你喜欢
  • 2012-02-14
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 2017-02-28
  • 1970-01-01
相关资源
最近更新 更多