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的
存在
是的,它有效。配置应该在抽象类和继承类中进行。我已经相应地编辑了你的答案。非常感谢。干杯这两个映射中都需要映射配置,这有点令人惊讶。