c #automapper字典到字典

Edo*_*don 6 c# dictionary automapper

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

超级英雄:

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

public class SomeHero {
 // unique properties
}
Run Code Online (Sandbox Code Playgroud)

Supervillan:

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

public class SomeVillan {
 // unique properties
}
Run Code Online (Sandbox Code Playgroud)

我尝试在其他类似的线程中遵循建议,但没有成功.这是我最近的尝试,执行失败:

CreateMap<KeyValuePair<string, Superheroes>, KeyValuePair<string, Supervillans>>(); 
Run Code Online (Sandbox Code Playgroud)

如何将我的超级英雄SuperNumber字典映射到我的Supervillan SuperNumber字典?

注意:SomeHero/SomeVillan模型将具有独特的属性,但我对此问题并不关心它们.

Tim*_*ace 5

它应该开箱即用。字典不需要显式配置映射:Dynamic 和 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", } },
    };
}
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

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

var config = new MapperConfiguration(cfg => {
    cfg.CreateMap<ClassA, ClassB>().ReverseMap();
});
Run Code Online (Sandbox Code Playgroud)

  • @ErikPhilips 2011 年这个问题的答案现在很愚蠢,从那时起就有了很多 AM 版本,因此将问题标记为重复项对任何人都没有帮助,相反。 (2认同)
  • @ErikPhilips 想附议上面的评论,我尝试了以前的解决方案,但它们在这一点上似乎都过时了。这个答案提供了一个真实的、更新的解决方案,对我来说确实有效。请注意,我的问题尝试了“原始”问题解决方案,这对我不起作用(可能是我的错)。请重新考虑。 (2认同)