2015-07-13 4 views
1

Я хочу использовать automapper для отображения между двумя списками. Один список содержит код и строку, а другой содержит код и другие поля. Я хочу использовать все существующие значения/свойства для целевого объекта, кроме одного. Возможно ли это с помощью automapper? Я не хочу указывать все свойства с помощью UseDestinationValue(). Пробовал следующее, но вместо того, чтобы вернуться мой список адресатов с одним свойством обновленной, она возвращает новый список с только совпадающих элементов (в обоих списках), и все поля равны нулю:Automapper использует свойства назначения и карту одного объекта

public static IMappingExpression<TSource, TDest> UseAllDestinationValues<TSource, TDest>(this IMappingExpression<TSource, TDest> expression) 
    { 
     expression.ForAllMembers(opt => opt.UseDestinationValue()); 
     return expression; 
    } 

    Mapper.CreateMap<Perm, PermViewModel>() 
      .UseAllDestinationValues() 
      .ForMember(dest => dest.CanEdit, opt => opt.MapFrom(s => s.editable)); 

var items = Mapper.Map<List<Perm>, List<PermViewModel>>(list, model.Items.Items); 

ответ

0

я должен был сделать что-то вроде аналогичных с использованием нулевых удвоений из одного приложения в другое. Вы можете настроить конвертер типов. Без ваших конкретных классов я не могу говорить точно, как это сделать, но вот мой пример.

Mapper.CreateMap<double?, double>().ConvertUsing<NullableDoubleConverter>(); 

private class NullableDoubleConverter : TypeConverter<double?, double> 
{ 
    protected override double ConvertCore(double? source) 
    { 
     if (source == null) 
      return Constants.NullDouble; 
     else 
      return (double)source; 
    } 
} 

Возможно, вы могли бы адаптировать это, используя что-то вроде этого.

Mapper.CreateMap<Perm, PermViewModel>().ConvertUsing<PermConverter>(); 

private class PermConverter : TypeConverter<Perm, PermViewModel> 
{ 
    protected override PermViewModel ConvertCore(Perm source) 
    { 
     return new PermViewModel() 
     { 
      //Set your parameters here. 
     }; 
    } 
} 
+0

Спасибо, что выглядит многообещающим. Но это вернет новый PermViewModel. Могу ли я получить доступ к существующему целевому объекту в конверторе типов и перезаписать одно свойство? –

+0

Он должен уметь. Это ссылочный объект, поэтому вы не видите, почему нет. Но! Я бы этого не сделал. Я бы вместо этого сделал для каждого и изменил его таким образом. – thinklarge

+0

Я просто перечитаю ваш комментарий. Преобразователь типов может создавать и изменять что-либо на целевом объекте. В этом случае это будет PermViewModel. Это может изменить и Пермь (я думаю). Но я бы не стал изменять Пермь. Отвечает ли вам вопрос? – thinklarge

Смежные вопросы