Словарь <string, string> отображается на объект с помощью Automapper - PullRequest
16 голосов
/ 05 сентября 2011

Ниже код только для этого вопроса

У меня такой класс, как

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

У меня словарь типа

Dictionary<string,string> data= new Dictionary<string,string>(); 
data.Add("Name","Rusi");
data.Add("Age","23");

User user= new User();

Теперь я хочу сопоставить User объект с этим dictionary, используя Automapper. Automapper отображает свойства объектов, но в моем случае есть словарь и объект.

Итак, пожалуйста, предложите мне, как я могу это сделать

Ответы [ 4 ]

24 голосов
/ 05 сентября 2011

AutoMapper отображает свойства объектов и не должен работать в таких сценариях.В этом случае вам понадобится Reflection magic.Вы можете обмануть промежуточной сериализацией:

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

И если вы настаиваете на использовании AutoMapper, вы можете, например, сделать что-то вроде:

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

, а затем:

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

Если вам нужно обработать более сложные иерархии объектов с подобъектами, вы должны задать себе следующий вопрос: Dictionary<string, string> правильная ли структура данных для использования в этом случае?

5 голосов
/ 05 сентября 2011

AutoMapper - довольно гибкое решение.Вероятно, вы могли бы добиться этого с помощью пользовательского профиля сопоставления, например:

public class UserMappingProfile : Profile
{
  // Props
  public override string ProfileName { get { return "UserMappingProfile"; } }

  // Methods
  public override void Configure()
  {
    CreateMap<User, Dictionary<string, string>>().ConvertUsing<DictionaryTypeConverter>();
    base.Configure();
  }

  // Types
  internal class DictionaryTypeConverter : ITypeConverter<User, Dictionary<string, string>>
  {
    public User Convert(ResolutionContext context)
    {
      var dict = context.SourceValue as Dictionary<string, string>;
      if (dict == null)
        return null;

      return new User() { Name = dict["Name"], Age = dict["Age"] };
    }
  }
}

. Таким образом я могу создать настраиваемый экземпляр сопоставителя:

var config = new Configuration(new TypeMapFactory(), MapperRegistry.AllMappers());
config.AddProfile<UserMappingProfile>();

config.AssertConfigurationIsValid();

var mapper = new MappingEngine(config);

Что я, вероятно, мог бы сделать:

var dict = new Dictionary<string, string> { { "Name", "Matt" }, { "Age", "27" } };
var user = mapper.Map<User, Dictionary<string, string>>(dict);
3 голосов
/ 29 августа 2018

Поскольку я только что наткнулся на этот вопрос, я хотел бы добавить этот ответ возможно в текущей версии AutoMapper (даже если исходный вопрос уже довольно старый):

1 голос
/ 27 апреля 2018

Гораздо более простое решение. Просто сопоставьте ваш объект с KeyValuePair. Пример:

CreateMap<KeyValuePair<Guid, string>, User>()
            .ForMember(u => u.Id, src => src.MapFrom(x => x.Key))
            .ForMember(u => u.Name, src => src.MapFrom(x => x.Value));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...