Dictionary mappe un object à l’aide de Automapper

Le code ci-dessous est juste pour cette question

Je vais avoir un cours comme

public User class { public ssortingng Name{get;set;} public ssortingng Age{get;set; } 

Je vais avoir un dictionnaire comme

 Dictionary data= new Dictionary(); data.Add("Name","Rusi"); data.Add("Age","23"); User user= new User(); 

Maintenant, je veux mapper User object User à ce dictionary utilisant Automapper . Automapper mappe les propriétés des objects mais dans mon cas, il y a un dictionnaire et un object.

Alors, s’il vous plaît me suggérer comment puis-je faire cela

AutoMapper mappe entre les propriétés des objects et n’est pas censé fonctionner dans de tels scénarios. Dans ce cas, vous avez besoin de la magie de reflection. Vous pouvez sortingcher par une sérialisation intermédiaire:

 var data = new Dictionary(); data.Add("Name", "Rusi"); data.Add("Age", "23"); var serializer = new JavaScriptSerializer(); var user = serializer.Deserialize(serializer.Serialize(data)); 

Et si vous insistez pour utiliser AutoMapper, vous pouvez par exemple faire quelque chose dans le sens suivant:

 Mapper .CreateMap, User>() .ConvertUsing(x => { var serializer = new JavaScriptSerializer(); return serializer.Deserialize(serializer.Serialize(x)); }); 

et alors:

 var data = new Dictionary(); data.Add("Name", "Rusi"); data.Add("Age", "23"); var user = Mapper.Map, User>(data); 

Si vous devez gérer des hiérarchies d’objects plus complexes avec des sous-objects, vous devez vous poser la question suivante: Dictionary la structure de données appropriée à utiliser dans ce cas?

AutoMapper est une solution assez flexible. Vous pouvez probablement y parvenir en utilisant un profil de mappage personnalisé, par exemple:

 public class UserMappingProfile : Profile { // Props public override ssortingng ProfileName { get { return "UserMappingProfile"; } } // Methods public override void Configure() { CreateMap>().ConvertUsing(); base.Configure(); } // Types internal class DictionaryTypeConverter : ITypeConverter> { public User Convert(ResolutionContext context) { var dict = context.SourceValue as Dictionary; if (dict == null) return null; return new User() { Name = dict["Name"], Age = dict["Age"] }; } } } 

Avec cela, je peux créer une instance personnalisée d’un mappeur:

 var config = new Configuration(new TypeMapFactory(), MapperRegistry.AllMappers()); config.AddProfile(); config.AssertConfigurationIsValid(); var mapper = new MappingEngine(config); 

Ce que je pourrais probablement faire:

 var dict = new Dictionary { { "Name", "Matt" }, { "Age", "27" } }; var user = mapper.Map>(dict); 

Comme je viens de tomber par hasard sur cette question, j’aimerais append cette réponse possible avec la version actuelle d’AutoMapper (même si la question d’origine est déjà très ancienne):

 public class MyConfig { public ssortingng Foo { get; set; } public int Bar { get; set; } } var config = new MapperConfiguration(cfg => {}); var mapper = config.CreateMapper(); var source = new Dictionary { ["Foo"] = "Hello", ["Bar"] = 123 }; var obj = mapper.Map(source); obj.Foo == "Hello"; // true 

Solution beaucoup plus simple. Mappez simplement votre object à partir de KeyValuePair. Exemple:

 CreateMap, User>() .ForMember(u => u.Id, src => src.MapFrom(x => x.Key)) .ForMember(u => u.Name, src => src.MapFrom(x => x.Value));