2010-12-27 4 views
3

リストプロパティを使用してオブジェクトをマップするオートマッパーは、デフォルトで、コピー先オブジェクトのリストプロパティをソースオブジェクトのインスタンスに設定します。AutoMapperを使用してリストアイテムをコピーする

automapperが新しいリストを作成し、アイテムをコピーするがリストインスタンスをコピーしない方法はありますか?

私は、次のテストに合格したいと思います:

ウィジェットクラスがどのように見える
var widget = new Widget 
       { 
        Tags = new List<string> {"big", "bright"} 
       }; 

Mapper.Reset(); 
Mapper.CreateMap<Widget, Widget>(); 

var widgetCopy = Mapper.Map<Widget, Widget>(widget); 

CollectionAssert.Contains(widgetCopy.Tags, "big"); 
CollectionAssert.Contains(widgetCopy.Tags, "bright"); 
Assert.AreNotSame(widget.Tags, widgetCopy.Tags); 

:2つのタグのプロパティは、同じインスタンスを指すので

class Widget 
{ 
    public IList<string> Tags { get; set; } 
} 

現在、最後のアサートが失敗しましたリスト。これは、オブジェクトがHibernateで永続化されているときの問題です。

答えて

3

あなたが求めているのは、深いクローニングで、何かAutoMapper isn't really designed to doです。

他にも利用可能なオプションがあります。 ValueInjecterがあなたに適しているかどうかを確認してください。このように私のAutoMapperマッピングを

public static class DeepCopyExtensions 
{ 
    public static List<T> DeepCopy<T>(this List<T> original) 
    { 
     lock(original) 
      return original.Select(AutoMapper.Mapper.Map<T, T>).ToList(); 
    } 

    public static T DeepCopy<T>(this T original) 
    { 
     return AutoMapper.Mapper.Map<T, T>(original); 
    } 
} 

と定義:

ルックDeep cloning with ValueInjecter

0

で私はこのような拡張メソッドを定義することによってこの問題を解決

Mapper.CreateMap<Widget, Widget>() 
    .ForMember(
     dest => dest.Tags, 
     opt => opt.MapFrom(src => src.Tags.DeepCopy())); 
関連する問題