Я пытаюсь развернуть завернутый класс в плоский объект через AutoMapper.
Я рассмотрел похожие вопросы, такие как Сопоставление времени выполнения AutoMapper C# в зависимости от свойства объекта, но я хочу, чтобы производный тип отображался с помощью AutoMapper, я не хочу return new MyFlatObject() в моей конфигурации AutoMapper.
Все свойства должны быть сопоставлены через дочернее свойство Value, только IsDeleted имеет отношение к родительскому.
Что у меня есть на данный момент:
Ошибка:
Были найдены несопоставленные элементы. Просмотрите типы и члены ниже. Добавить собственное выражение сопоставления, игнорировать, добавить собственный преобразователь или измените тип источника/назначения. Если соответствующий конструктор отсутствует, добавьте no-arg ctor, добавьте необязательные аргументы или сопоставьте все параметры конструктора
=> MyObject -> MyFlatObject (список элементов назначения)
[TestClass]
public class AutoMappingTest
{
public interface IMyObject { }
public class DeletableWrapper
{
public bool IsDeleted { get; set; }
public IMyObject Value { get; set; }
}
public class MyObject : IMyObject
{
public bool Foo { get; set; }
}
public class MyFlatObject
{
public bool IsDeleted { get; set; }
public bool Foo { get; set; }
}
[TestMethod]
public void MappingTest()
{
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<DeletableWrapper, MyFlatObject>().ConstructUsing((src, ctx) => ctx.Mapper.Map<MyFlatObject>(src.Value))
.ForMember(e => e.IsDeleted, opt => opt.MapFrom(s => s.IsDeleted));
cfg.CreateMap<MyObject, MyFlatObject>();
});
config.AssertConfigurationIsValid();
}
}
Спасибо за замечание, что-то пошло не так, когда я пытался его отформатировать. Сейчас исправил. Да, я.





Примечание: мое решение без ConstructUsing
Из config.AssertConfigurationIsValid он жалуется, что для члена IsDeleted в правиле отображения (класса) нет сопоставления (правила) из MyObject в MyFlatObject.
Вы можете применить Ignore(), поскольку в исходном коде нет сопоставления, и поэтому он не будет жаловаться.
Для выравнивания вы можете использовать IncludeMembers.
var config = new MapperConfiguration((cfg) =>
{
cfg.CreateMap<AutoMappingTest.DeletableWrapper, AutoMappingTest.MyFlatObject>()
.ForMember(dest => dest.IsDeleted, opt => opt.MapFrom(src => src.IsDeleted))
.IncludeMembers(src => (AutoMappingTest.MyObject)src.Value);
cfg.CreateMap<AutoMappingTest.MyObject, AutoMappingTest.MyFlatObject>()
.ForMember(dest => dest.IsDeleted, opt => opt.Ignore());
});
По отзывам @Lucian, .ForMember можно опустить, поскольку AutoMapper автоматически сопоставит элементы, если у них одинаковые имена:
cfg.CreateMap<AutoMappingTest.DeletableWrapper, AutoMappingTest.MyFlatObject>()
.IncludeMembers(src => (AutoMappingTest.MyObject)src.Value);
Знак MapFrom можно убрать.
Вы уверены, что ваш код компилируется? Судя по тому, что я прочитал, переменная
cfgотсутствует, объявленная в файлеMapperConfiguration. Вы пытаетесь сопоставитьDeletableWrapperсMyFlatObject?