オブジェクトのリストをあるタイプから別のタイプにマッピングするとき、AutoMapper はキャッシュを使用していると思います。次のコードを見てください。
namespace ConsoleApplication
{
class Program
{
static void Main(string[] args)
{
Mapper.CreateMap<Source, Destination>()
.ForMember(dest => dest.SomeOtherNumber, opt => opt.Ignore());
Mapper.AssertConfigurationIsValid();
var sourceList = new List<Source>();
var s1 = new Source {SomeNumber = 10};
var s2 = new Source {SomeNumber = 69};
sourceList.Add(s1);
sourceList.Add(s1);
sourceList.Add(s1);
sourceList.Add(s2);
var destList = Mapper.Map<List<Source>, List<Destination>>(sourceList);
destList[0].SomeOtherNumber = 100;
destList.ForEach(x => Console.WriteLine("SomeNumber: {0}, SomeOtherNumber: {1}", x.SomeNumber, x.SomeOtherNumber));
Console.ReadLine();
}
}
public class Source
{
public int SomeNumber { get; set; }
}
public class Destination
{
public int SomeNumber { get; set; }
public int SomeOtherNumber { get; set; }
}
}
コードの出力は、destList リストの最初のオブジェクトの SomeOtherNumber のみを設定したにもかかわらず、最初の 3 つの項目が同じオブジェクト参照を参照しているため、同じプロパティ値を持っていることを示しています。この動作を無効にできるかどうかを知りたいので、ソース リストに重複した参照があっても、宛先リストに重複した参照はありません。これは理にかなっていますか?
出力は次のとおりです。
SomeNumber: 10, SomeOtherNumber: 100
SomeNumber: 10, SomeOtherNumber: 100
SomeNumber: 10, SomeOtherNumber: 100
SomeNumber: 69, SomeOtherNumber: 0