Automapper -не удается разрешить общий список

#c# #automapper #codeplex

#c# #automapper #codeplex

Вопрос:

  Mapper.CreateMap<BusinessObject, Proxy.DataContacts.DCObject>()
 .ForMember(x => x.ExtensionData, y => y.Ignore())
 .ForMember(z => z.ValidPlaces, a=> a.ResolveUsing(typeof(ValidPlaces)));
 Mapper.AssertConfigurationIsValid();  

 proxydcObject = Mapper.Map<BusinessObject, Proxy.DataContracts.DCObject>(_instanceOfBusinessObject); //throws an exception saying ValidPlaces could not be resolved

 public class BusinessObject
 {
     public Enum1 Enum1 { get; set; }
     public List<ValidPlaces> ValidPlaces{ get; set; }
 }

 public class ValidPlaces
 {
     public int No { get; set; }
     public string Name { get; set; }
}

public class DCObject
{
    [DataMember]
    public Enum1 Enum1 { get; set; }
    [DataMember]
    public List<ValidPlaces> ValidPlaces{ get; set; }
}
  

Mapper.CreateMap работает, когда вызывается функция поиска Mapper.AssertConfigurationIsValid(); (в этой строке нет исключений), но
когда я на самом деле вызываю службу WCF в следующей строке, которая здесь не показана, Automapper выдает исключение, в котором говорится, что допустимые места не могут быть сопоставлены.Работает нормально, если я помещаю Ignore() в свойство ValidPlaces, но в идеале хочу, чтобы это было передано.

Пожалуйста, помогите любым экспертам по AutoMapper.

Ответ №1:

Вы должны быть в состоянии удалить строку для допустимых мест:

 Mapper.CreateMap<BusinessObject, Proxy.DataContacts.DCObject>()
 .ForMember(x => x.ExtensionData, y => y.Ignore());
  

Преобразователи значений предназначены для пользовательского класса для выполнения разрешения значений и должны иметь тип IValueResolver. Это некоторая защитная кодировка, которую я должен внедрить. Но для списка T -> списка U, пока AutoMapper может отображать T -> U, это будет работать. В вашей ситуации, поскольку T == U, вам не нужно делать ничего дополнительного. В противном случае вам придется сопоставить T с U (но не список T -> Список U).

Комментарии:

1. Мой DCObject имеет extensiondata, но бизнес-объект не обладает этим свойством, и, следовательно, я устанавливаю его на место, иначе я получаю ошибку. В моем случае также T == U, но я хочу, чтобы List<T> был переведен в List<U>

2. Это нормально. AutoMapper поддерживает List<T> автоматически, без какой-либо дополнительной настройки. Я могу сделать это: Mapper.Map<int[], List<int>>(новый [] {1, 2, 3}); С нулевой конфигурацией. Вам нужно только зарегистрировать типы элементов, и поскольку в вашем случае типы элементов идентичны, дополнительная настройка не требуется. AutoMapper поддерживает назначаемые типы «из коробки».