2016-10-31 22 views
1

こんにちは私は継承クラスのために働いています。 基本オブジェクトとインタフェースのマップを作成するのは一度だけです。子クラスが独自のメンバを実装する場合は、基本クラスまたはintrfaceで定義されていないメンバのマッピングをnlyに設定します。Automapper 5.1.1継承マッピング

サンプルコードから始めましょう。

public class DtoClass { 
    public string Field1 { get; set; } 
    public string Field2 { get; set; } 
    public string Field3 { get; set; } 
} 

public interface IField3 { 
    public string EntityField3 { get; set; } 
} 

public class BaseEntityClass { 
    public string EntityField1 { get; set; } 
} 

public class ChildEntityClass : BaseEntityClass, IField3 { 
    public string EntityField2 { get; set; } 
    public string EntityField3 { get; set; } 
} 


CreateMap<BaseEntityClass, DtoClass>() 
    .ForMember(c => c.Field1 , m => m.MapFrom(a => a.EntityField1)) 
    .Include<ChildEntityClass, DtoClass>(); 

CreateMap<IField3, DtoClass>() 
    .ForMember(c => c.Field3 , m => m.MapFrom(a => a.EntityField3)); 

CreateMap<ChildEntityClass, DtoClass>() 
    .ForMember(c => c.Field2 , m => m.MapFrom(a => a.EntityField2)); 

添付コードdosnt work ofcourse。呼び出すとき:

AutoMapper.Mapper.Map<ChildEntityClass, DtoClass>(instanceOfChildEntityClass); 

は私だけCreateMap<ChildEntityClass, DtoClass>().

一度だけ、基本クラスのマッピングとのインターフェースを実装する方法任意のアイデアで定義されているメンバーをマッピングしますか? はい、すべてのタイプのChildEntityClass、BaseEntityClass、およびIField3をDtoClassにマップしたいと思います。

このようなマッピングをエレガントに設定するためのヒントは、歓迎します。

編集:私は明確にするため、サブクラスからunecssary IncludeBaseを削除していないが、両方
のどれも - サブクラス でIncludeBase - 基底クラスで私のために 作品を含めます。このような問題を引き起こす原因は何ですか?

答えて

0

IncludeBaseを使用して動作します。基本型のマッピングを呼び出す場合でも、だから、サブクラスにマップされていないすべての列が自動的に無視された

 foreach (string propName in map.GetUnmappedPropertyNames()) 
     { 
      expr.ForMember(propName, opt => opt.Ignore()); 
     } 

:初期化メソッドでの私のプロジェクトで

のような何かの隠された呼び出しでした。シンプルで問題がある。

上記のようなコードはおそらくMapper.Configuration.AssertConfigurationIsValid();に合格しています。

0

あなたは.IncludeBase.Includeを使用してはいけません - それを選択してそれに固執してください。私は.IncludeBaseを好んでいます、私はサブクラスで定義するのがより理にかなっていると思います。あなたの場合、暗黙の変換がないので、Includeを使ってIField3を参照することはできません。

次のコードでは、多くの場合、問題は、私は、サンプルコードで提供範囲外であった偶然にも私のため

CreateMap<BaseEntityClass, DtoClass>() 
    .ForMember(dest => dest.Field1, opt => opt.MapFrom(src => src.EntityField1)) 
    ; 

CreateMap<IField3, DtoClass>() 
    .ForMember(dest => dest.Field3, opt => opt.MapFrom(src => src.EntityField3)) 
    ; 

CreateMap<ChildEntityClass, DtoClass>() 
    .ForMember(dest => dest.Field2, opt => opt.MapFrom(src => src.EntityField2)) 
    .IncludeBase<BaseEntityClass, DtoClass>() 
    .IncludeBase<IField3, DtoClass>() 
    ; 
+0

これはまだ動作しません。最後に設定されたマッピングだけが呼び出され、ベースクラスのマッピングは使用されません。私のためにベースクラスに含まれていません。 もう1つの質問aoutインターフェイスは何ですか? わかりやすくするために、サンプルコードにIncludeBase <>を削除しました。 – PabloPC

+0

Mapper.AssertConfigurationIsValid()を使用してプロファイルをテストすることを確認してください。これは、何が問題を引き起こしているのかを指摘するかもしれません。 – Richard

+0

サンプルコードを使用して私のために働くIncludeBaseを使用して私の答えを更新しました。 – Richard

関連する問題