AutoMapper字典压扁(AutoMapper Dictionary Flattening)

2019-07-29 08:28发布

我有一个Dictionary<User, bool>

用户如下:

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

第二种类型,布尔,指示该用户是否是已登录用户的朋友。 我想变平这个字典成List<UserDto > UserDto定义为:

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

IsFriend代表字典的价值。

我怎样才能做到这一点?

Answer 1:

您应该能够只用一个映射1做到这一点:

你需要映射KeyValuePair<User, bool>UserDto 。 这是必要的AutoMapper能够字典的内容映射到的内容List<T>我们最终创造(更多的解释中可以找到这个答案 )。

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 使用自动文件夹2.0



Answer 2:

我知道我迟到了比赛,但是这似乎是使用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简单类型。 对于复杂的类型,你可以提供一个功能/ Action委托和地图使用该功能。(里面上面的for-each)

例如。

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


Answer 3:

对于简单的东西就是这样,一个快速的LINQ查询就可以了。 假设dict是您的Dictionary<User,bool>

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


文章来源: AutoMapper Dictionary Flattening
标签: AutoMapper