AutoMapper字典展平

时间:2012-05-09 15:43:20

标签: automapper

我有Dictionary<User, bool>

用户如下:

 public class User {
   public string Username { get; set; }
   public string Avatar { get; set;
}

第二种类型bool表示此用户是否是登录用户的朋友。 我想将此词典压缩为List<UserDto&gt; UserDto定义为:

public class UserDto {
   public string Username { get; set; }
   public string Avatar { get; set; }
   public bool IsFriend { get; set; }
}

IsFriend表示字典的值。

我该怎么做?

3 个答案:

答案 0 :(得分:13)

你应该只用一个映射 1

来做到这一点

您需要将KeyValuePair<User, bool>映射到UserDto。这对于AutoMapper来说是必要的,以便能够将字典的内容映射到我们最终创建的List<T>的内容(更多的解释可以在this answer中找到)。

Mapper.CreateMap<KeyValuePair<User, bool>, UserDto>()
    .ForMember(dest => dest.Username, opt => opt.MapFrom(src => src.Key.UserName))
    .ForMember(dest => dest.Avatar, opt => opt.MapFrom(src => src.Key.Avatar))
    .ForMember(dest => dest.IsFriend, opt => opt.MapFrom(src => src.Value));

然后,使用.Map电话中的映射:

Mapper.Map<Dictionary<User, bool>, List<UserDto>>(...);

您不需要自己映射集合,因为只要您映射了内容,AutoMapper就可以处理DictionaryList的映射。彼此的集合(在我们的例子中,KeyValuePair<User, bool>UserDto)。


修改:这是另一个不需要将每个User属性映射到UserDto的解决方案:

Mapper.CreateMap<User, UserDto>();
Mapper.CreateMap<KeyValuePair<User, bool>, UserDto>()
    .ConstructUsing(src => Mapper.Map<User, UserDto>(src.Key))
    .ForMember(dest => dest.IsFriend, opt => opt.MapFrom(src => src.Value));

1 使用AutoMapper 2.0

答案 1 :(得分:0)

我知道我已经迟到了,但这似乎是一个更通用的解决方案,使用automapper将字典映射到.Net类型(简单)

public static IMappingExpression<Dictionary<string, string>, TDestination> ConvertFromDictionary<TDestination>(
        this IMappingExpression<Dictionary<string, string>, TDestination> exp)
{
    foreach (PropertyInfo pi in typeof(TDestination).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
    {
        exp.ForMember(propertyName, cfg => cfg.MapFrom(r => r[propertyName]));
    }
    return exp;
}

像这样使用

Mapper.CreateMap<Dictionary<string, string>, TDestination>().ConvertFromDictionary();

其中TDestination可以是.NET简单类型。对于复杂类型,您可以使用该函数提供Func / Action委托和映射。(在上面的for-each中)

例如

if (customPropNameMapFunc != null && !string.IsNullOrEmpty(customPropNameMapFunc(propertyName)))
{
   exp.ForMember(propertyName, cfg => cfg.MapFrom(r => r[customPropNameMapFunc(propertyName)]));
}

答案 2 :(得分:-1)

对于像这样简单的东西,快速LINQ查询就可以了。假设dictDictionary<User,bool>

var conv = from kvp in dict
            select new UserDto
                    {
                        Avatar = kvp.Key.Avatar,
                        IsFriend = kvp.Value,
                        Username = kvp.Key.Username
                    };