2017-11-29 9 views
1

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(...)行?

例えば、

​​

答えて

2

原則として、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>(); 

注意を。

+0

私のソースオブジェクトは他人に公開されているため、すばらしくてきれいに見える必要があります。すべての宛先クラスが(現在)「DestBase」クラスから継承しているわけではありません。そのため、ソースクラスでは(ダミー)インタフェースを実装する必要はありません。しかし、それ以外の解決策がない場合は、問題を解決する可能性があります...私はそれをテストします... –

+0

不運にも、インクルードが機能するためには、共通のソースタイプまたはインターフェイスが必要です。 –