我有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
表示字典的值。
我该怎么做?
答案 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就可以处理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 使用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查询就可以了。假设dict
是Dictionary<User,bool>
:
var conv = from kvp in dict
select new UserDto
{
Avatar = kvp.Key.Avatar,
IsFriend = kvp.Value,
Username = kvp.Key.Username
};