我有一个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
代表字典的价值。
我怎样才能做到这一点?
您应该能够只用一个映射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可以处理映射Dictionary
的List
,你已经制定了馆藏的内容 ,对方只要(在我们的情况下, 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
我知道我迟到了比赛,但是这似乎是使用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)]));
}
对于简单的东西就是这样,一个快速的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
};