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