C# 集合的基于Automapper约定的映射

C# 集合的基于Automapper约定的映射,c#,dictionary,automapper,C#,Dictionary,Automapper,我有一个项目,试图将字典映射到ViewModel.NamedProperty。我正在尝试使用AutoMapper自定义解析器根据约定执行映射。我的约定是,如果源字典键存在命名属性,则从字典的值映射属性。以下是我的示例类: class User { string Name {get;set;} Dictionary<string, AccountProp> CustomProperties {get;set;} } class AccountProp { strin

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

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"};
类用户
{
字符串名称{get;set;}
字典自定义属性{get;set;}
}
类AccountProp
{
字符串属性值{get;set;}
//其他一些属性
}
类UserViewModel
{
字符串名称{get;set;}
DateTime LastLogin{get;set;}
字符串城市{get;set}
}
var user=新用户()
{
Name=“鲍勃”
};
user.CustomProperties.Add(“LastLogin”,new AccountProp(){PropertyValue=DateTime.Now};
user.CustomProperties.Add(“City”,new AccountProp(){PropertyValue=“SomeWhere”};
我希望按照约定将用户CustomProperties字典映射到所有属性的平坦UserViewModel,并且不希望为映射单独指定每个属性


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

下面是用于此目的的代码。不确定它是否好

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
Mapper.CreateMap()
.ForMember(dest=>dest.Name,opt=>opt.MapFrom(src=>src.Name))//可选
.ForMember(dest=>dest.City,opt=>opt.MapFrom(src=>src.CustomProperties.FirstOrDefault(x=>x.Key==“City”).Value.PropertyValue.ToString())//句柄null
.ForMember(dest=>dest.LastLogin,opt=>opt.MapFrom(src=>Convert.ToDateTime(src.CustomProperties.FirstOrDefault(x=>x.Key==“LastLogin”).Value.PropertyValue));//句柄null

我最终创建了一个自定义类型转换器来处理这种情况,效果非常好:

public class ObjectToPropertyTypeConverter<TFromEntity> : ITypeConverter<TFromEntity, HashSet<Property>>
{
 //perform custom conversion here
}
公共类ObjectTopPropertyTypeConverter:ITypeConverter
{
//在此执行自定义转换
}
然后,我实现了自定义映射,如下所示:

 AutoMapper.Mapper.CreateMap<MyViewModel, HashSet<Property>>()
               .ConvertUsing<ObjectToPropertyTypeConverter<MyViewModel>>();
AutoMapper.Mapper.CreateMap()
.ConvertUsing();

谢谢,但我不想像我在原始帖子中指定的那样映射单个属性。我知道我可以使用FormMember和MapFrom实现这种映射。我希望它使用通用的TypeConverter或其他一些Automapper约定按约定映射,因为不仅仅有几个属性。