#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 этого не делают!