6

我有一个Dictionary<User, bool>

用户如下:

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

第二种类型,bool,表示这个用户是否是登录用户的朋友。我想将此 Dictionary 展平为List<UserDto> UserDto 定义为:

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

IsFriend表示字典的值。

我怎样才能做到这一点?

4

3 回答 3

14

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

您需要将 a 映射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 可以处理将 映射Dictionary到 aList只要您已将集合的内容相互映射(在我们的例子中,映射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

于 2012-05-15T12:14:07.277 回答
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)]));
}
于 2014-03-18T15:57:23.650 回答
-1

对于像这样简单的事情,一个快速的 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
                    };
于 2012-05-09T16:08:43.283 回答