我试图映射这个:
var values = new Dictionary<string, object>()
{
["Address.City"] = "New York",
["FirstName"] = "First Name",
["LastName"] = "Last Name"
};
进入这个:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Address Address { get; set; }
}
public class Address
{
public string City { get; set; }
}
如果我没有更改任何配置,我会将Address
视为空。我尝试过不同的方法。解析器或只是在MapperConfiguration
中编辑我的字典,如下所示:
var config = new MapperConfiguration(cfg => {
const string addressPrefix = "Address.";
cfg.CreateMap<IDictionary<string, object>, Person>()
.ForMember(x => x.Address, x => x.MapFrom(c => new Dictionary<string, object>(c.Where(dic => dic.Key.StartsWith(addressPrefix)).ToDictionary(dic => dic.Key.Replace(addressPrefix, string.Empty), dic => dic.Value))));
cfg.CreateMap<IDictionary<string, object>, Person>()
.ForMember(dest => dest.Address, opt => opt.ResolveUsing<PersonResolver>());
});
var mapper = config.CreateMapper();
var person = mapper.Map<Person>(values);
这两种情况我成功地将Address
映射为右,但我丢失了名字和姓氏。有没有办法将映射器重置为其他成员的默认值?
我的解析器:
public class PersonResolver : IValueResolver<IDictionary<string, object>, Person, Address>
{
public Address Resolve(IDictionary<string, object> source, Person destination, Address destMember, ResolutionContext context)
{
const string addressPrefix = "Address.";
var address = new Address();
if (source.Keys.Any(x => x.StartsWith(addressPrefix, StringComparison.InvariantCulture)))
{
var addressItems = source
.Where(dic => dic.Key.StartsWith(addressPrefix, StringComparison.InvariantCulture))
.ToDictionary(dic => dic.Key.Replace(addressPrefix, string.Empty, StringComparison.InvariantCulture), dic => dic.Value);
address = context.Mapper.Map<Address>(addressItems);
}
return address;
}
}