使用AutoMapper映射字典

使用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); 
+0

请注意,第二个ConstructUsing位使用第一个地图来完成它的工作。 – 2011-06-18 01:18:35