我正在尝试通过 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();
}
}
注意:我的解决方案没有
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);