代码之家  ›  专栏  ›  技术社区  ›  Edon

C自动将词典映射到词典

  •  0
  • Edon  · 技术社区  · 5 年前

    这个问题已经有了答案:

    我正在尝试将超级英雄模型自动映射到超级别墅模型,每个模型都有类似的字典声明:

    超级英雄 以下内容:

    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>>(); 
    

    我该如何描绘我的超级英雄 SuperNumber 给我的超级别墅的字典 超数 字典?

    注:Somehero/Somevillan模型将有独特的特性,但我不关心这个问题。

    0 回复  |  直到 5 年前
        1
  •  3
  •   Erik Philips    5 年前

    它应该是开箱即用的。字典不要求显式配置映射: 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", } },
        };
    }
    

    如果使用下面的automapper,映射应该自动工作。

    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();
    });