AutoMapper将派生类映射到基类型集合的属性

问题描述:

我试图将两个不同的对象映射到从接口派生的对象。另外,我需要将另一个属性映射到来自dtos的派生类型。鉴于此对象结构:AutoMapper将派生类映射到基类型集合的属性

public interface ICoverage 
{ 
    string Name { get; set; } 
    string Code { get; set; } 
} 

public class CoverageA : ICoverage 
{ 
    public string Name { get; set; } 
    public string Code { get; set; } 
    public string Current { get; set; } 
} 

public class CoverageB : ICoverage 
{ 
    public string Name { get; set; } 
    public string Code { get; set; } 
    public bool HasRecord { get; set; } 
} 

public class Application 
{ 
    public int ApplicationId { get; set; } 
    public string Code { get; set; } 
    public List<ICoverage> Coverages { get; set; } 

    public Application() 
    { 
     Coverages = new List<ICoverage>(); 
    } 
} 

public class StagingDto 
{ 
    public string Referrer { get; set; } 
    public string Code { get; set; } 
    public CoverageADto CoverageA { get; set; } 
    public CoverageBDto CoverageB { get; set; } 
} 

public class CoverageADto 
{ 
    public string Current { get; set; } 
} 

public class CoverageBDto 
{ 
    public bool HasRecord { get; set; } 
} 

下面的作品该映射,但我想知道是否有更好的方式来做到这一点:我想从不必创建任何远离

  cfg.CreateMap<StagingDto, Application>() 
      .AfterMap((src, dest) => dest.Coverages.Add(new CoverageB() 
      { 
       HasRecord = src.CoverageB.HasRecord, 
       Code = src.Code 
      })) 
      .AfterMap((src, dest) => dest.Coverages.Add(new CoverageA() 
      { 
       Current = src.CoverageA.Current, 
       Code = src.Code 
      })); 

理想扩展方法。

对于我来说,它看起来好一点。

cfg.CreateMap<StagingDto, Application>() 
    .ForMember(dest => dest.Coverages, 
     opt => opt.ResolveUsing(src => new ICoverage[] 
     { 
      new CoverageA 
      { 
       Current = src.CoverageA.Current, 
       Code = src.Code 
      }, 
      new CoverageB 
      { 
       HasRecord = src.CoverageB.HasRecord, 
       Code = src.Code 
      } 
     })); 
+0

这是我偶然发现还有一个替代方案,我用了一个列表,而不是数组。我同意它看起来更好。感谢您看看这个! – AvacadoRancher