簡體   English   中英

AutoMapper中繼承類的默認映射配置

[英]Default mapping configuration for inherited classes in AutoMapper

是否可以在AutoMapper中創建默認的目標映射?

源類:

class SourceA { 
  public string X { get; set; } 
}
class SourceB { 
  public string Y { get; set; } 
}

目標類別:

class DestBase { 
  public List<string> Z { get; set; }
}
class DestA : DestBase { 
  public string X { get; set; } 
}
class DestB : DestBase { 
  public string Y { get; set; } 
}

映射配置包含以下內容:

cfg.CreateMap<SourceA, DestA>()
  .ForMember(dest => dest.Z, src => src.MapFrom(s => null));
cfg.CreateMap<SourceB, DestB>()
  .ForMember(dest => dest.Z, src => src.MapFrom(s => null));

是否可以為所有繼承DestBase目標類創建默認映射,以避免重復的.ForMember(...)行?

例如。 就像是:

cfg.CreateMap<object, DestBase>
   .ForMember(dest => dest.Z, src => src.MapFrom(s => new List<string>()));

原則上可以,使用Include方法可以,但有一個警告。

如果您從源類型object定義映射,則此映射將匹配所有類型。 也許您可以為應該受此映射影響的源類型引入接口ISource

所以看起來可能像這樣:

    class SourceA : ISource { 
        public string X { get; set; } 
    }

    class SourceB : ISource { 
        public string Y { get; set; } 
    }

    cfg.CreateMap<ISource, DestBase>
       .Include<SourceA, DestA>
       .Include<SourceB, DestB>
       .Include<SourceC, DestC>
       .ForMember(dest => dest.Z, , o => o.MapFrom(src => new List<string>()));

    cfg.CreateMap<SourceA, DestA>()
        .ForMember(dest => dest.X, o => o.MapFrom(src => src.X));

    cfg.CreateMap<SourceB, DestB>()
        .ForMember(dest => dest.Y, o => o.MapFrom(src => src.Y));

    // still need to create a map even if no additional properties are to be mapped
    cfg.CreateMap<SourceC, DestC>();

請注意,即使沒有要映射的其他屬性,您仍需要為所有包含的類型創建映射。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM