如何通过 AutoMapper 和 ConstructUsing 映射包装对象

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

我正在尝试通过自动映射器将包装的类解包为平面对象。

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

return new MyFlatObject()
在我的 automapper 配置中

我还想使用 ConstructUsing,因为所有属性都应通过

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>((MyObject)src.Value))
     .ForMember(e => e.IsDeleted, opt => opt.MapFrom(s => s.IsDeleted));

     cfg.CreateMap<MyObject, MyFlatObject>();
 });

        config.AssertConfigurationIsValid();
    }
}
c# automapper
1个回答
0
投票

使用

ConvertUsing
这是可能的:

var config = new MapperConfiguration(cfg =>
{
    cfg.CreateMap<DeletableWrapper, MyFlatObject>()
    .ConvertUsing((src, dst, ctx) =>
    {
        var result = ctx.Mapper.Map(src.Value, dst);
        result.IsDeleted = src.IsDeleted;
        return result;
    });

    cfg.CreateMap<MyObject, MyFlatObject>().ForMember(e => e.IsDeleted, opt => opt.Ignore());
});

但是它不是很通用,每种类型都必须手动设置并忽略

IsDeleted
属性。

© www.soinside.com 2019 - 2024. All rights reserved.