2011-11-28 88 views
1

我正在使用Automapper,我想知道是否有可能將源集合中的所有項目添加到目標。添加項目到新的集合,而不是替換整個集合

考慮以下幾點:

public class A { public IDictionary<int, string> myDictionary = new Dictionary<int, string>(); } 

public class B { public IDictionary<int, string> myDictionary = new Dictionary<int, string>(); } 

然後創建的映射:

Mapper.CreateMap<A, B>(); 

,做實際映射:

Mapper.Map<A, B>(instanceOfA); 

我相信屏幕後面會出現這種情況:

newInstanceOfB.myDictionary = instanceOfA.myDictionary 

但是,它可以告訴Automapper做到這一點(也許有東西自定義轉換器...):

foreach (var item in instanceOfA.myDictionary) 
    newInstanceOfB.myDictionary[item.Key] = item.Value 

回答

7

這似乎爲我工作

Mapper.CreateMap<A, B>() 
    .ForMember(d => d.myDictionary, opt => opt.ResolveUsing(
       s => s.myDictionary.ToDictionary(pair => pair.Key, pair => pair.Value))); 

這裏是意見後完成樣品

public class A { public IDictionary<int, string> myDictionary = new Dictionary<int, string>(); } 
public class B { public IDictionary<int, string> myDictionary = new Dictionary<int, string>(); } 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var instanceOfA = new A 
           { 
            myDictionary = new Dictionary<int, string> 
                { 
                 {1, "a"}, 
                 {2, "b"} 
                } 
           }; 
     Mapper.CreateMap<A, B>() 
      .ForMember(d => d.myDictionary, opt => opt.ResolveUsing(
       s => s.myDictionary.ToDictionary(pair => pair.Key, pair => pair.Value))); 
     var instanceOfB = Mapper.Map<A, B>(instanceOfA); 
     instanceOfA.myDictionary[1] = "c"; 

     if (instanceOfB.myDictionary[1] == "c") 
      Console.WriteLine("Failed"); 
     else 
      Console.WriteLine("Succeeded"); 
     Console.ReadLine(); 
    } 
} 

編輯: * 再次編輯*

Mapper.CreateMap<A, B>() 
    .ForMember(d => d.myDictionary, opt => opt.Ignore()) 
    .AfterMap((s, d) => 
         { 
         d.myDictionary.Clear(); 
         s.myDictionary.ToList().ForEach(p => d.myDictionary.Add(p)); 
        }); 
+0

嗨博卡, 感謝您的回覆,但它不會做的伎倆。我將一個DTO對象映射到來自NHibernate的Domain對象。 AutoMapper不僅會更改集合中的項目,還會更改集合本身。如果我忽略映射中的集合並手動添加/刪除一個對象到另一個對象(使用foreach即可),它可以正常工作。我只是想知道你是否可以在Automapper中做到這一點,但我猜測它不能完成:-( – blenaerts

+0

我不確定我是否遵循。在我的答案中,我能夠映射集合創建新項目。看不出爲什麼這對於DTO和Nhibernate實體不起作用,你可以像上面那樣用ResolveUsing來完成,或者你可以像你說的那樣忽略它,然後用AfterMap子句進行映射 – boca

+0

正確但是在由Automapper改變了類B的myDictionary的哈希碼的例子,因爲它總是返回一個新的字典(我檢查過源代碼;-))。所以NHibernate不會保存域對象,因爲它看到原來的字典被改變了。我設法通過製作一個以Automapper地圖開始的幫助方法來解決問題,然後通過反射進行項目的複製。 – blenaerts

相關問題