2011-07-15 80 views
2

我遇到了一个我自动映射配置的问题,我似乎无法解决。AutoMapper问题映射实体到词典<GUID,字符串>

我有一个联系类型的实体,我试图将这些列表映射到字典。但是,映射只是没有做任何事情。源字典保持空白。任何人都可以提供建议吗?

下面是接触式

public class Contact 
{ 
    public Guid Id { get; set ;} 
    public string FullName { get; set; } 
} 

我自动映射配置看起来如下

Mapper.CreateMap<Contact, KeyValuePair<Guid, string>>() 
    .ConstructUsing(x => new KeyValuePair<Guid, string>(x.Id, x.FullName)); 

而且我调用代码如下

var contacts = ContactRepository.GetAll(); // Returns IList<Contact> 
var options = new Dictionary<Guid, string>(); 
Mapper.Map(contacts, options); 

回答

5

AutoMapper网站上的文档非常粗略。从我所知道的,Mapper.Map中的第二个参数仅用于确定返回值应该是什么类型,而实际上并未修改。这是因为它允许您基于只在运行时已知类型的现有对象执行动态映射,而不是在泛型中对类型进行硬编码。

因此,您的代码中的问题是您没有使用Mapper.Map的返回值,该值实际上包含最终转换的对象。这是我测试过的代码的修改版本,并按照您的预期正确返回转换后的对象。

var contacts = ContactRepository.GetAll(); 
var options = Mapper.Map(contacts, new Dictionary<Guid, string>()); 
// options should now contain the mapped version of contacts 

虽然这会更有效利用的通用版本,而不是构建一个不必要的对象只是指定类型:

var options = Mapper.Map<List<Contact>, Dictionary<Guid, string>>(contacts); 

这里是可以在LinqPad运行的working code sample(需要组装参考AutoMapper.dll来运行该示例。)

希望这有助于!

+0

感谢您提供的样品mellamokb。我不敢相信我没有遇到过这个! – WDuffy

10

这应该工作的简化版本与以下,没有Mapper需要...

var dictionary = contacts.ToDictionary(k => k.Id, v => v.FullName); 
+0

尼斯加布,虽然技术上没有回答AutoMapper问题这种情况下我认为你的解决方案是一个更清洁的选择 – WDuffy

0

在GitHub上AutoMapper另一种解决方案:

https://github.com/AutoMapper/AutoMapper/issues/51

oakinger [CodePlex上]刚写的是解决了这个小扩展方法:

public static class IMappingExpressionExtensions 
{ 
public static IMappingExpression<IDictionary, TDestination> ConvertFromDictionary<TDestination>(this IMappingExpression<IDictionary, TDestination> exp, Func<string, string> propertyNameMapper) 
{ 
foreach (PropertyInfo pi in typeof(Invoice).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) 
{ 
if (!pi.CanWrite || 
pi.GetCustomAttributes(typeof(PersistentAttribute), false).Length == 0) 
{ 
continue; 
} 

string propertyName = pi.Name; 
propertyName = propertyNameMapper(propertyName); 
exp.ForMember(propertyName, cfg => cfg.MapFrom(r => r[propertyName])); 
} 
return exp; 
} 
} 

Usage: 

Mapper.CreateMap<IDictionary, MyType>() 
.ConvertFromDictionary(propName => propName) // map property names to dictionary keys 
+0

这不会编译。 PersistentAttribute不是有效的对象。但那并不重要。你如何处理cfg.MapFrom(r => r [propertyName])?它需要一个字符串参数,而不是一个lambda。 – Nuzzolilo

+0

该参考资料是https://github.com/AutoMapper/AutoMapper/issues/51 – Kiquenet

相关问题