我正在尝试通过自动映射器将包装的类解包为平面对象。
我查看了类似的问题,例如 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();
}
}
使用
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
属性。