2012-10-16 14 views
5

私はAutomapperを使用しています。 私は2つのクラスを持っています。 TypeBには2つのプロパティがあり、そのうちの1つにプライベートセッタがあり、このプロパティの値はコンストラクタを介して渡されます。 TypeBにはデフォルトコンストラクタがありません。Automapper Mapにコンテキスト値を渡すには?

質問:TypeAをTypeBに変換するためにAutomapperを設定することは可能ですか?

public class TypeA 
{ 
    public string Property1 { get; set; } 
} 

public class TypeB 
{ 
    public TypeB(int contextId) 
    { ContextId = contextId; } 

    public string Property1 { get; set; } 

    public int ContextId { get; private set; } 
} 

public class Context 
{ 
    private int _id; 

    public void SomeMethod() 
    { 
     TypeA instanceOfA = new TypeA() { Property1 = "Some string" }; 

     // How to configure Automapper so, that it uses constructor of TypeB 
     // and passes "_id" field value into this constructor? 

     // Not work, since "contextId" must be passed to constructor of TypeB 
     TypeB instanceOfB = Mapper.Map<TypeB>(instanceOfA); 

     // Goal is to create folowing object 
     instanceOfB = new TypeB(_id) { Property1 = instanceOfA.Property1 }; 
    } 
} 

答えて

8

あなたはそれはあなたがAutoMapperは残りを埋めることができます手であなたのTypeBを作成することができます代替ソリューションとして

TypeA instanceOfA = new TypeA() { Property1 = "Some string" }; 
_id = 3;    

Mapper.CreateMap<TypeA, TypeB>().ConstructUsing((TypeA a) => new TypeB(_id));  
TypeB instanceOfB = Mapper.Map<TypeB>(instanceOfA); 

// instanceOfB.Property1 will be "Some string" 
// instanceOfB.ContextId will be 3 

を使用すべきコンストラクタAutoMapperを伝えるためにConstructUsingオーバーロードのいずれかを使用することができますプロパティ ":

TypeA instanceOfA = new TypeA() { Property1 = "Some string" }; 
_id = 3;    

Mapper.CreateMap<TypeA, TypeB>(); 

TypeB instanceOfB = new TypeB(_id); 
Mapper.Map<TypeA, TypeB>(instanceOfA, instanceOfB); 

// instanceOfB.Property1 will be "Some string" 
// instanceOfB.ContextId will be 3 
+1

私はAutomapperのすべての設定を別の場所に持っているので、変換する前に新しいマップを作成したくありません。イオンが私に必要なものです。あなたの答えをありがとう。 – Andris

関連する問題