Проблема с автоматическим отображением
-
06-09-2019 - |
Вопрос
Пытаюсь автоматически сопоставить некоторые объекты.
Исходные объекты имеют свойства с _ перед именем, объекты назначения - нет.Возможно ли реализовать ОДНО создание карты, чтобы automapper сопоставлял все _properties со свойствами
для всех типов источников.
class MyMapper<TFrom, TTo>{
TTo PerformMap(TFrom fromObject){
Mapper.CreateMap<From, To>(); // ???
TTo result = Mapper.Map<From, To>(fromObject);
//result.Id.ShouldBe(value from TFrom._Id);
return result;
}
}
class From
{
public int _Id { get; set; }
public string _Name { get; set; }
}
class To
{
public int Id { get; set; }
public string Name { get; set; }
}
Решение
Вам может помочь кое-что, что я недавно добавил в AutoMapper, - пользовательские соглашения об именовании.Если вы проверите багажник (R107), осмотритесь в поисках нестандартных решений.Прямо сейчас у меня есть два соглашения об именовании (PascalCase и lower_case_underscore), но на самом деле это всего лишь вопрос определения правильного регулярного выражения, которое поможет вам начать работу:
Прямо сейчас соглашения об именовании являются глобальными и зависят от профиля.Поскольку эта функция является новой, нет никакой документации, кроме тестов.
Другие советы
Вот как я это делаю
Mapper.Initialize(cfg =>
{
cfg.RecognizeDestinationPrefixes(new []{"_"});
cfg.RecognizePrefixes(new[] { "_" });
cfg.CreateMap<To, From>().ReverseMap();
});
Для этого вы могли бы добавить пользовательское сопоставление для решения этого конкретного случая:
Mapper.CreateMap<From, To>()
.ForMember( dest => dest.Id, opt => opt.MapFrom( src => src._Id ) )
.ForMember( dest => dest.Name, opt => opt.MapFrom( src => src._Name ) );