Читая про ReversMap()
у AutoMapper, не могу понять разницу между методами ForMember
и ForPath
. Тот функционал, который выполняет ForPath
на данной странице я обычно делаю с помощью ForMember
.
Вот пример, где я конфигурирую двухсторонний маппинг и все работает правильно:
public class Customer
{
public string Surname { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
public class CustomerDto
{
public string CustomerName { get; set; }
public int Age { get; set; }
}
static void Main(string[] args)
{
Mapper.Initialize(cfg =>
{
cfg.CreateMap<Customer, CustomerDto>()
.ForMember(dist => dist.CustomerName, opt => opt.MapFrom(src => $"{src.Surname} {src.Name}"))
.ReverseMap()
.ForMember(dist => dist.Surname, opt => opt.MapFrom(src => src.CustomerName.Split(' ')[0]))
.ForMember(dist => dist.Name, opt => opt.MapFrom(src => src.CustomerName.Split(' ')[1]));
});
// код с маппингом Customer -> CustomerDto
//...
//
// код с маппингом CustomerDto -> Customer
var customerDto = new CustomerDto
{
CustomerName = "Shakhabov Adam",
Age = 31
};
var newCustomer = Mapper.Map<CustomerDto, Customer>(customerDto);
}
Методы ForMember
и ForPath
в чем то дублируют функционал? Или что нельзя сделать с ForMember
, но можно с ForPath
?
Это легко выяснить заглянув в исходники.
ForMember
не выполняет никаких проверок и обрабатывает любое выражение c IMemberConfigurationExpression
.
public IMappingExpression<TSource, TDestination> ForMember<TMember>(Expression<Func<TDestination, TMember>> destinationMember,
Action<IMemberConfigurationExpression<TSource, TDestination, TMember>> memberOptions)
{
var memberInfo = ReflectionHelper.FindProperty(destinationMember);
return ForDestinationMember(memberInfo, memberOptions);
}
ForPath
же работает только с IPathConfigurationExpression
и для прочих членов бросает исключение.
public IMappingExpression<TSource, TDestination> ForPath<TMember>(Expression<Func<TDestination, TMember>> destinationMember,
Action<IPathConfigurationExpression<TSource, TDestination>> memberOptions)
{
if(!destinationMember.IsMemberPath())
{
throw new ArgumentOutOfRangeException(nameof(destinationMember), "Only member accesses are allowed.");
}
...
Если тебе нужен функционал, описываемый интерфейсом IPathConfigurationExpression
, используй ForPath
, в противном случае - ForMember
Пример использования метода Ignore()
на той же странице по твоей ссылке:
cfg.CreateMap<Order, OrderDto>()
.ForMember(d => d.CustomerName, opt => opt.MapFrom(src => src.Customer.Name))
.ReverseMap()
.ForPath(s => s.Customer.Name, opt => opt.Ignore());
Виртуальный выделенный сервер (VDS) становится отличным выбором
Доброго времени сутокМне требуется не большая помощь со стороны разработчиков C# или JS
Посоветуйте сайты в интернете, где можно выполнять небольшие проекты по программированию, возможно бесплатно, которыми не стыдно потом будет...
Упрощу реальную задачу для примера - есть вьюшка окна, в окне есть несколько кнопок и условная панельПо нажатию на каждую кнопку в панели...
Я понимаю, что на EN Stackoverflow есть подобные вопросы, но все же, мне не понятно, что не так с WindowsFormsHost? Почему поверх него нельзя ставить WPF контрол?