将序列映射到数组时,Automapper returns 引用同一对象
Automapper returns reference to the same object when mapping sequences to arrays
我有一个 IEnumerable<T>
的扩展方法,它映射序列项和 returns 克隆数组:
public static class AutoMapperExtensions
{
public static T[] MapToArray<T>(this IEnumerable<T> sequence)
{
return Mapper.Map<T[]>(sequence);
}
}
这是代码示例,在我看来它的行为很奇怪:
Mapper.CreateMap<SomeClass, SomeClass>();
Mapper.AssertConfigurationIsValid();
// clone list members and store them into array
var list = new List<SomeClass>
{
new SomeClass { MyProperty = 1 },
new SomeClass { MyProperty = 2 },
};
// works fine
var array = list.MapToArray();
// let's map array again
var newArray = array.MapToArray();
// ...and ensure, that new array was created;
// this fails, because Automapper returns reference to the same array
Debug.Assert(array != newArray);
在我看来,最后的结果是错误的。虽然我期待,映射器将创建新的克隆数组,它只是 returns 对同一数组的引用。
这是在其他地方记录的还是这是一个错误?
所以这不是错误 - 当 AutoMapper 看到两个可分配的对象时,它会简单地分配它们。如果您想覆盖该行为,请在两种集合类型之间创建一个映射。
我有一个 IEnumerable<T>
的扩展方法,它映射序列项和 returns 克隆数组:
public static class AutoMapperExtensions
{
public static T[] MapToArray<T>(this IEnumerable<T> sequence)
{
return Mapper.Map<T[]>(sequence);
}
}
这是代码示例,在我看来它的行为很奇怪:
Mapper.CreateMap<SomeClass, SomeClass>();
Mapper.AssertConfigurationIsValid();
// clone list members and store them into array
var list = new List<SomeClass>
{
new SomeClass { MyProperty = 1 },
new SomeClass { MyProperty = 2 },
};
// works fine
var array = list.MapToArray();
// let's map array again
var newArray = array.MapToArray();
// ...and ensure, that new array was created;
// this fails, because Automapper returns reference to the same array
Debug.Assert(array != newArray);
在我看来,最后的结果是错误的。虽然我期待,映射器将创建新的克隆数组,它只是 returns 对同一数组的引用。
这是在其他地方记录的还是这是一个错误?
所以这不是错误 - 当 AutoMapper 看到两个可分配的对象时,它会简单地分配它们。如果您想覆盖该行为,请在两种集合类型之间创建一个映射。