Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用automapper在两个字典之间进行映射_.net_Dictionary_Automapper_.net Core 3.1_Automapper 10 - Fatal编程技术网

.net 使用automapper在两个字典之间进行映射

.net 使用automapper在两个字典之间进行映射,.net,dictionary,automapper,.net-core-3.1,automapper-10,.net,Dictionary,Automapper,.net Core 3.1,Automapper 10,我正试图用字典在这两个类之间进行映射 class HouseFrom { public IDictionary<string, PersonFrom> Items { get; set; } = new Dictionary<string, PersonFrom>(); } class PersonFrom { public int Age { get; set; } } class HouseTo { public IDictionary&l

我正试图用字典在这两个类之间进行映射

class HouseFrom
{
    public IDictionary<string, PersonFrom> Items { get; set; } = new Dictionary<string, PersonFrom>();
}

class PersonFrom
{
    public int Age { get; set; }
}

class HouseTo
{
    public IDictionary<string, PersonTo> People { get; set; } = new Dictionary<string, PersonTo>();
}

class PersonTo
{
    public string Name { get; set; }
    public int Age { get; set; }
}
或者映射没有填充persono的Name参数,因此为null

如果您能在这个问题上提供帮助,我将不胜感激

更新: 我尝试了以下映射,但均未成功:

        new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<HouseFrom, HouseTo>()
                .ForMember(t => t.People, opt => opt.MapFrom(t => t.Items));
            cfg.CreateMap<KeyValuePair<string, PersonFrom>, KeyValuePair<string, PersonTo>>()
                .ConstructUsing((t, c) => KeyValuePair.Create(t.Key, c.Mapper.Map<PersonTo>(t)));
            cfg.CreateMap<KeyValuePair<string, PersonFrom>, PersonTo>()
                .ForMember(src => src.Age, opt => opt.MapFrom(t => t.Value.Age))
                .ForMember(src => src.Name, opt => opt.MapFrom(t => t.Key));
        });
        //Throws : Mutating a key collection derived from a dictionary is not allowed.
新的MapperConfiguration(cfg=>
{
cfg.CreateMap()
.ForMember(t=>t.People,opt=>opt.MapFrom(t=>t.Items));
cfg.CreateMap()
.ConstructUsing((t,c)=>KeyValuePair.Create(t.Key,c.Mapper.Map(t));
cfg.CreateMap()
.ForMember(src=>src.Age,opt=>opt.MapFrom(t=>t.Value.Age))
.ForMember(src=>src.Name,opt=>opt.MapFrom(t=>t.Key));
});
//抛出:不允许对派生自字典的密钥集合进行变异。

新的MapperConfiguration(cfg=>
{
cfg.CreateMap()
.ForMember(t=>t.People,opt=>opt.MapFrom(t=>t.Items));
CreateMap();
cfg.CreateMap()
.ConstructUsing((t,c)=>KeyValuePair.Create(t.Key,c.Mapper.Map(t.Value)))
.AfterMap((b,a)=>{a.Value.Name=a.Key;});
});
//为Name返回NULL

新的MapperConfiguration(cfg=>
{
cfg.CreateMap()
.ForMember(t=>t.People,opt=>opt.MapFrom(t=>t.Items));
cfg.CreateMap()
.ConstructUsing((t,c)=>t.Select(t=>newpersono{Age=t.Value.Age,Name=t.Key}).ToDictionary(k=>k.Name,v=>v));
});
//抛出:不允许对派生自字典的密钥集合进行变异。
解决方案:

            return new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<HouseFrom, HouseTo>()
                    .ForMember(t => t.People, opt => opt.MapFrom(t => t.Items));
                cfg.CreateMap<IDictionary<string, PersonFrom>, IDictionary<string, PersonTo>>()
                    .ConstructUsing((t, c) => t.Select(t => new PersonTo { Age = t.Value.Age, Name = t.Key }).ToDictionary(k => k.Name, v => v))
                    .ForMember(t => t.Keys, opt => opt.Ignore())
                    .ForMember(t => t.Values, opt => opt.Ignore());
            });

返回新的MapperConfiguration(cfg=>
{
cfg.CreateMap()
.ForMember(t=>t.People,opt=>opt.MapFrom(t=>t.Items));
cfg.CreateMap()
.ConstructUsing((t,c)=>t.Select(t=>newpersono{Age=t.Value.Age,Name=t.Key}).ToDictionary(k=>k.Name,v=>v))
.ForMember(t=>t.Keys,opt=>opt.Ignore())
.ForMember(t=>t.Values,opt=>opt.Ignore());
});
你可以这样试试

  var config = new MapperConfiguration(cfg => {
            cfg.CreateMap<PersonFrom, PersonTo>().ForMember(x => x.Age, o => o.MapFrom(y => y.Age));
            cfg.CreateMap<KeyValuePair<string, PersonFrom>, KeyValuePair<string, PersonTo>>()
            .ConstructUsing(x => new KeyValuePair<string, PersonTo>(x.Key,new PersonTo { Age = x.Value.Age}));
            cfg.CreateMap<HouseFrom, HouseTo>().ForMember(x=>x.People,o=>o.MapFrom(y=>y.Items));
        }); 

        IMapper mapper = config.CreateMapper();

        var testDict = new Dictionary<string, PersonFrom>();
        var testValue = new PersonFrom()
        {
            Age = 100
        };
        var testValue2 = new PersonFrom()
        {
            Age = 200
        };
        testDict.Add("key1", testValue);
        testDict.Add("key2", testValue2);

        var houseFrom = new HouseFrom { Items = testDict };

        var houseTo = mapper.Map<HouseFrom,HouseTo>(houseFrom);

        foreach (var item in houseTo.People)
        {
            Console.WriteLine(item.Key+" "+item.Value.Name +" "+item.Value.Age);
        }
var config=new-MapperConfiguration(cfg=>{
CreateMap().formMember(x=>x.Age,o=>o.MapFrom(y=>y.Age));
cfg.CreateMap()
.ConstructUsing(x=>newkeyvaluepair(x.Key,newpersono{Age=x.Value.Age}));
CreateMap().formMember(x=>x.People,o=>o.MapFrom(y=>y.Items));
}); 
IMapper mapper=config.CreateMapper();
var testDict=新字典();
var testValue=newpersonfrom()
{
年龄=100
};
var testValue2=newpersonfrom()
{
年龄=200
};
testDict.Add(“key1”,testValue);
testDict.Add(“键2”,testValue2);
var houseFrom=newhousefrom{Items=testDict};
var houseTo=mapper.Map(houseFrom);
foreach(houseTo.People中的var项目)
{
Console.WriteLine(item.Key+“”+item.Value.Name+“”+item.Value.Age);
}

Mapping Dictionary是内置的,因此您只需要为自己的类型创建映射。您好,这不起作用,因为没有填充Name属性。ToPerson的Name属性为NULL,未设置为源的KeyValuePair的密钥。
        new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<HouseFrom, HouseTo>()
                .ForMember(t => t.People, opt => opt.MapFrom(t => t.Items));
            cfg.CreateMap<PersonFrom, PersonTo>();
            cfg.CreateMap<KeyValuePair<string, PersonFrom>, KeyValuePair<string, PersonTo>>()
                .ConstructUsing((t, c) => KeyValuePair.Create(t.Key, c.Mapper.Map<PersonTo>(t.Value)))
                .AfterMap((b, a) => { a.Value.Name = a.Key; });
        });
        //Return NULL for Name
        new MapperConfiguration(cfg =>
        {
            cfg.CreateMap<HouseFrom, HouseTo>()
                .ForMember(t => t.People, opt => opt.MapFrom(t => t.Items));
            cfg.CreateMap<IDictionary<string, PersonFrom>, IDictionary<string, PersonTo>>()
                .ConstructUsing((t, c) => t.Select(t => new PersonTo { Age = t.Value.Age, Name = t.Key }).ToDictionary(k => k.Name, v => v));
        });
        //Throws : Mutating a key collection derived from a dictionary is not allowed.
            return new MapperConfiguration(cfg =>
            {
                cfg.CreateMap<HouseFrom, HouseTo>()
                    .ForMember(t => t.People, opt => opt.MapFrom(t => t.Items));
                cfg.CreateMap<IDictionary<string, PersonFrom>, IDictionary<string, PersonTo>>()
                    .ConstructUsing((t, c) => t.Select(t => new PersonTo { Age = t.Value.Age, Name = t.Key }).ToDictionary(k => k.Name, v => v))
                    .ForMember(t => t.Keys, opt => opt.Ignore())
                    .ForMember(t => t.Values, opt => opt.Ignore());
            });

  var config = new MapperConfiguration(cfg => {
            cfg.CreateMap<PersonFrom, PersonTo>().ForMember(x => x.Age, o => o.MapFrom(y => y.Age));
            cfg.CreateMap<KeyValuePair<string, PersonFrom>, KeyValuePair<string, PersonTo>>()
            .ConstructUsing(x => new KeyValuePair<string, PersonTo>(x.Key,new PersonTo { Age = x.Value.Age}));
            cfg.CreateMap<HouseFrom, HouseTo>().ForMember(x=>x.People,o=>o.MapFrom(y=>y.Items));
        }); 

        IMapper mapper = config.CreateMapper();

        var testDict = new Dictionary<string, PersonFrom>();
        var testValue = new PersonFrom()
        {
            Age = 100
        };
        var testValue2 = new PersonFrom()
        {
            Age = 200
        };
        testDict.Add("key1", testValue);
        testDict.Add("key2", testValue2);

        var houseFrom = new HouseFrom { Items = testDict };

        var houseTo = mapper.Map<HouseFrom,HouseTo>(houseFrom);

        foreach (var item in houseTo.People)
        {
            Console.WriteLine(item.Key+" "+item.Value.Name +" "+item.Value.Age);
        }