使用AutoMapper强制浅拷贝

时间:2015-04-23 13:24:53

标签: c# automapper

我有一个源类型,它具有简单的属性和集合类型属性。 我有一个目标类型,它具有完全相同的简单属性和完全相同的集合类型属性。

编辑:我忘了提到集合类型属性不仅名称相同,而且实际上是完全相同的类型,关于集合类型,两种项目类型

为AutoMapper配置一个简单映射后,如:

var destination = Mapper.Map<MyDestinationType>(source);

并映射实例:

Assert.IsTrue(ReferenceEquals(destination.MyCollection, source.MyCollection));
似乎我得到了一份很深的副本。 我不希望有一个深层副本,我希望目标和源集合类型属性只是引用复制:

function RAM_Information()
{
var SystemAttributes = GetObject("winmgmts:");
var RAMSize = 0;
var MemoryPackets = SystemAttributes.ExecQuery("SELECT Capacity FROM  Win32_PhysicalMemory");

var enumItems = new Enumerator(MemoryPackets);
for ( ; !enumItems.atEnd(); enumItems.moveNext())
{
RAMSize += aqConvert.StrToFloat(enumItems.item().Capacity);
}

Log.Message("Total physical memory: " + VarToStr(RAMSize*0.000000001) + " GB");
return RAMSize*0.000000001;
}



function ProcessorInformation()
{
return Sys.CPU;
}

1 个答案:

答案 0 :(得分:0)

很奇怪,AutoMapper文档没有提及此行为。 AutoMapper尝试将自定义集合深克隆到List<>中。

interface IMyCollection : IEnumerable<int> // or class
{
}

class From
{
    public IMyCollection Collection { get; set; }
}

class To
{
    public IMyCollection Collection { get; set; }
}

解决方案:

cfg.CreateMap<IMyCollection, IMyCollection>().ConvertUsing(s => s); // force shallow clone
cfg.CreateMap<From, To>();