我有一个项目,我试图将字典映射到ViewModel.NamedProperty。我试图使用AutoMapper自定义解析器来执行基于约定的映射。我的惯例是,如果源字典键存在named属性,则从字典的值映射属性。以下是我的示例类:
class User
{
string Name {get;set;}
Dictionary<string, AccountProp> CustomProperties {get;set;}
}
class AccountProp
{
string PropertyValue {get;set;}
//Some other properties
}
class UserViewModel
{
string Name {get;set;}
DateTime LastLogin {get;set;}
string City {get;set}
}
var user = new User()
{
Name = "Bob"
};
user.CustomProperties.Add("LastLogin", new AccountProp(){PropertyValue = DateTime.Now};
user.CustomProperties.Add("City", new AccountProp(){PropertyValue = "SomeWhere"};
我希望按照惯例将User CustomProperties字典映射到展平的UserViewModel,并且我不希望为映射单独指定每个属性。
最好的方法是什么?我在考虑自定义值解析器,但似乎我必须指定我想要单独映射的每个成员。如果我想这样做,我只需在没有AutoMapper的情况下手动执行映射。
答案 0 :(得分:0)
以下是用于此目的的代码。不确定它是否好。
Mapper.CreateMap<User, UserViewModel>()
.ForMember(dest => dest.Name, opt => opt.MapFrom(src => src.Name)) // Optional
.ForMember(dest => dest.City, opt => opt.MapFrom(src => src.CustomProperties.FirstOrDefault(x => x.Key == "City").Value.PropertyValue.ToString())) // Handle null
.ForMember(dest => dest.LastLogin, opt => opt.MapFrom(src => Convert.ToDateTime(src.CustomProperties.FirstOrDefault(x => x.Key == "LastLogin").Value.PropertyValue))); //Handle null
答案 1 :(得分:0)
我最终创建了一个自定义类型转换器来处理这种情况并且效果很好:
public class ObjectToPropertyTypeConverter<TFromEntity> : ITypeConverter<TFromEntity, HashSet<Property>>
{
//perform custom conversion here
}
然后,我按如下方式实现了自定义映射:
AutoMapper.Mapper.CreateMap<MyViewModel, HashSet<Property>>()
.ConvertUsing<ObjectToPropertyTypeConverter<MyViewModel>>();