Автоматическое отображение и иерархия классов

#c# #automapper #derived

#c# #автоматическое отображение #производный

Вопрос:

Учитывая следующие источники:

 public class SourceBase { public string TheString { get; set; } }
public class SourceDerived : SourceBase { }
  

и пункты назначения:

 public class DestBase { public string MyString { get; set; } }
public class DestDerived : DestBase { }
  

И это отображение:

   CreateMap<SourceBase, DestBase>()
    .ForMember(dest => dest.MyString, o => o.MapFrom(x => x.TheString))
    .Include<SourceDerived, DestDerived>();

  CreateMap<SourceDerived, DestDerived>();
  Mapper.AssertConfigurationIsValid();  // Exception is thrown here
  

Однако это выдает ошибку сопоставления, в которой говорится, что myString не отображается в DestDerived. Что дает? Действительно ли мне нужно повторять сопоставления для свойств базового класса во всех производных типах (у меня действительно есть более одного подкласса в моем реальном коде).

Редактировать:

Точное исключение заключается в том, что не удалось отобразить следующие 1 свойство в DestDerived: myString. Добавьте пользовательское выражение сопоставления, игнорируйте или переименуйте свойство в DestDerived.

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

1. В чем именно заключается ошибка?

Ответ №1:

Пожалуйста, проверьте этот пост:http://groups.google.com/group/automapper-users/browse_thread/thread/69ba514a521e9599

Он отлично работает, если вы объявите его, как в приведенном ниже коде (используя AutoMapper 1.1.0.188). Я не уверен, решает ли это вашу проблему.

 var result = Mapper.CreateMap<SourceBase, DestBase>()
                .ForMember(dest => dest.MyString, o => o.MapFrom(x => x.TheString));
               //.Include<SourceDerived, DestDerived>();
            Mapper.CreateMap<SourceDerived, DestDerived>();
            var source = new SourceDerived();
            var destDerived = new DestDerived();
            source.TheString = "teststring";
            var mapResult = Mapper.Map<SourceBase, DestBase>(source, destDerived).MyString;
            Console.WriteLine(mapResult);
  

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

1. Нет, у нас это не работает. Также действительно странно, что если вы вызываете Mapper.Map(source, typeof(SourceDerived), typeof(DestDerived)), то ваш пример кода завершается с ошибкой. Исключений нет, но и сопоставление не выполняется.

2. Мы также вызываем Mapper.AssertConfigurationIsValid() . Я думаю, вы обнаружите, что если вы добавите этот вызов сразу после настройки своих сопоставлений, вы получите исключение, упомянутое в моем сообщении.

3. Спасибо за ваши комментарии. Мне жаль, что я не смог ничем помочь!

4. Нет проблем, я не уверен, почему ваш пример работает, но другие вызовы Map этого не делают!