基于自动映射器约定的集合映射

本文关键字:映射 集合 约定 于自动 | 更新日期: 2023-09-27 18:31:39

我有一个项目,我正在尝试将字典映射到ViewModel.NamedProperty。 我正在尝试使用自动映射器自定义解析器来执行基于约定的映射。 我的约定是,如果源字典键存在命名属性,则从字典的值映射属性。 以下是我的示例类:

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"};

我想按照约定将用户自定义属性字典映射到所有属性的平展用户视图模型,并且我不想为映射单独指定每个属性。

最好的

方法是什么? 我在想自定义值解析程序,但似乎我必须指定要单独映射的每个成员。 如果我想这样做,我只需手动执行映射而无需自动映射器。

基于自动映射器约定的集合映射

下面是用于此目的的代码。不知道好不好。

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

我最终创建了一个自定义类型转换器来处理这种情况,它工作得很好:

public class ObjectToPropertyTypeConverter<TFromEntity> : ITypeConverter<TFromEntity, HashSet<Property>>
{
 //perform custom conversion here
}

然后,我按如下方式实现了自定义映射:

 AutoMapper.Mapper.CreateMap<MyViewModel, HashSet<Property>>()
               .ConvertUsing<ObjectToPropertyTypeConverter<MyViewModel>>();
相关文章: