AutoMapper - 如何使用 ConstructUsing 映射包装对象

问题描述 投票:0回答:1

我正在尝试通过 AutoMapper 将包装的类解包为平面对象。

我查看了类似的问题,例如 AutoMapper c# runmapping dependent on an object property,但我希望派生类型由 AutoMapper 映射,我不想在我的 AutoMapper 配置中

return new MyFlatObject()

所有属性都应通过

Value
子属性进行映射,只有
IsDeleted
与父级相关。

到目前为止我所拥有的:

错误是:

发现未映射的成员。查看下面的类型和成员。添加自定义映射表达式、忽略、添加自定义解析器,或者 修改源/目标类型 如果没有匹配的构造函数,请添加一个 无参数构造函数,添加可选参数,或映射所有构造函数参数
=> 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();
    }
}
c# automapper
1个回答
3
投票

注意:我的解决方案没有

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);
© www.soinside.com 2019 - 2024. All rights reserved.