C# 自动映射继承错误
我有以下抽象类C# 自动映射继承错误,c#,mapping,automapper,automapper-3,C#,Mapping,Automapper,Automapper 3,我有以下抽象类 public abstract class BaseClass { public int NumberProperty { get; set; } } public abstract class BaseClass_DTO { public int NumberProperty { get; set; } public string NumberPropertyAsString { get; set; } } 和下面的具体类别 public class
public abstract class BaseClass
{
public int NumberProperty { get; set; }
}
public abstract class BaseClass_DTO
{
public int NumberProperty { get; set; }
public string NumberPropertyAsString { get; set; }
}
和下面的具体类别
public class ConcreteA : BaseClass
{
public string StringProperty { get; set; }
}
public class ConcreteA_DTO : BaseClass_DTO
{
public string StringProperty { get; set; }
}
这是地图
Mapper.Initialize( cfg => {
cfg.CreateMap<BaseClass, BaseClass_DTO>()
.ForMember( p => p.NumberPropertyAsString, opt => opt.MapFrom( x => x.NumberProperty.ToString() ) );
cfg.CreateMap<ConcreteA, ConcreteA_DTO>()
.IncludeBase<BaseClass, BaseClass_DTO>()
.ReverseMap();
} );
Mapper.AssertConfigurationIsValid();
发生此错误的原因是调用了
ReverseMap()
。如何设置反向映射以忽略成员而不复制映射?您需要使用忽略反向映射中的numberPropertyString
.ReverseMap()
.ForSourceMember(p => p.NumberPropertyAsString, opt => opt.Ignore());
似乎在您的特定映射配置中,您应该在基础和具体中同时进行配置
1。在基类映射中。
cfg.CreateMap<BaseClass, BaseClass_DTO>()
.ForMember(p => p.NumberPropertyAsString, opt => opt.MapFrom(x => x.NumberProperty.ToString()))
.ReverseMap()
.ForSourceMember(p => p.NumberPropertyAsString, opt => opt.Ignore());
cfg.CreateMap<ConcreteA, ConcreteA_DTO>()
.IncludeBase<BaseClass, BaseClass_DTO>()
.ReverseMap()
.ForSourceMember(p => p.NumberPropertyAsString, opt => opt.Ignore());
cfg.CreateMap()
.FormMember(p=>p.numberPropertyString,opt=>opt.MapFrom(x=>x.NumberProperty.ToString())
.ReverseMap()
.ForSourceMember(p=>p.numberPropertySString,opt=>opt.Ignore());
2。在具体的课程地图中。
cfg.CreateMap<BaseClass, BaseClass_DTO>()
.ForMember(p => p.NumberPropertyAsString, opt => opt.MapFrom(x => x.NumberProperty.ToString()))
.ReverseMap()
.ForSourceMember(p => p.NumberPropertyAsString, opt => opt.Ignore());
cfg.CreateMap<ConcreteA, ConcreteA_DTO>()
.IncludeBase<BaseClass, BaseClass_DTO>()
.ReverseMap()
.ForSourceMember(p => p.NumberPropertyAsString, opt => opt.Ignore());
cfg.CreateMap()
.IncludeBase()
.ReverseMap()
.ForSourceMember(p=>p.numberPropertySString,opt=>opt.Ignore());
谢谢您的回答。对但不幸的是,调用ReverseMap()
将反转类型,对于调用.formMember()
的第一个参数,我有一个基类
类型,它没有NumberPropertyString
属性。我就是这样问的,“不复制地图”。@Lorenzo啊,好的。似乎还有一个ForSourceMember
,可用于在映射中选择源成员而不是目标成员。注意,因为我现在没有安装Automapper的项目,所以我无法检查它是否有效。如果没有,我会帮大家一个忙,删除这个答案。没问题。让我试试。这对我来说更有意义。没有意识到SourceMember的存在
是的,它有效。配置应该在抽象类和继承类中进行。我已经相应地编辑了你的答案。非常感谢。干杯这两个映射中都需要映射配置,这有点令人惊讶。