使用AutoMapper映射字典
问题描述:
鉴于这些类,如何映射它们的字典?使用AutoMapper映射字典
public class TestClass
{
public string Name { get; set; }
}
public class TestClassDto
{
public string Name { get; set; }
}
Mapper.CreateMap<TestClass, TestClassDto>();
Mapper.CreateMap<Dictionary<string, TestClass>,
Dictionary<string, TestClassDto>>();
var testDict = new Dictionary<string, TestClass>();
var testValue = new TestClass() {Name = "value1"};
testDict.Add("key1", testValue);
var mappedValue = Mapper.Map<TestClass, TestClassDto>(testValue);
var mappedDict = Mapper.Map<Dictionary<string, TestClass>,
Dictionary<string, TestClassDto>>(testDict);
映射其中之一,在这种情况下mappedValue,工作正常。
映射它们的字典最终没有在目标对象中的条目。
我在做什么工作?
答
您遇到的问题是因为AutoMapper正在努力映射字典的内容。你必须考虑它是什么店 - 在这种情况下KeyValuePairs。
如果试图创建的KeyValuePair组合的映射器,你会很快制定出,你不能直接作为Key属性没有一个二传手。
AutoMapper解决这个问题,但允许您使用构造函数进行映射。
/* Create the map for the base object - be explicit for good readability */
Mapper.CreateMap<TestClass, TestClassDto>()
.ForMember(x => x.Name, o => o.MapFrom(y => y.Name));
/* Create the map using construct using rather than ForMember */
Mapper.CreateMap<KeyValuePair<string, TestClass>, KeyValuePair<string, TestClassDto>>()
.ConstructUsing(x => new KeyValuePair<string, TestClassDto>(x.Key,
x.Value.MapTo<TestClassDto>()));
var testDict = new Dictionary<string, TestClass>();
var testValue = new TestClass()
{
Name = "value1"
};
testDict.Add("key1", testValue);
/* Mapped Dict will have your new KeyValuePair in there */
var mappedDict = Mapper.Map<Dictionary<string, TestClass>,
Dictionary<string, TestClassDto>>(testDict);
请注意,第二个ConstructUsing位使用第一个地图来完成它的工作。 – 2011-06-18 01:18:35