强制使用AutoMapper进行浅拷贝

3
我有一个源类型,它有简单属性和集合类型属性。我有一个目标类型,它具有完全相同的简单属性和完全相同的集合类型属性。
编辑:我忘了提到集合类型属性不仅名称相同,而且实际上是完全相同的类型,涉及到集合类型和项类型。
在我为AutoMapper配置一个简单映射之后:
Mapper.CreateMap<MySourceType, MyDestinationType>();

并映射一个实例:

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

看起来我得到了一个深拷贝。 我不想要深拷贝,我希望目标和源集合类型的属性只是引用复制:

Assert.IsTrue(ReferenceEquals(destination.MyCollection, source.MyCollection));

1
你只能在共同继承的类型上进行浅复制。而 AutoMapper 的目的是进行深度复制。 - tdbeckett
1
@Clint,这既不是懒惰也不是滥用。有很多属性。此外,目标功能中的集合类型部分是只读的,因此无需深度复制。 - g.pickardou
由于它们是相同类型,所以对于浅复制你根本不需要使用AutoMapper。obj1 = obj2就能完成任务。 - tdbeckett
1
@tdbeckett 我相信你有些困惑。他想要深度复制根对象,但是浅复制属性/引用。 - nightski
1
@tdbeckett:浅拷贝不是引用拷贝。顺便说一下,引用拷贝甚至不是一个术语。它是引用赋值。请谷歌浅拷贝,你会发现它是什么。 - g.pickardou
显示剩余5条评论
1个回答

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>();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接