我在较旧的应用程序中工作(从 1.1 天开始),并且有许多非通用集合,例如:
[Serializable]
public class MyEntityList : CollectionBase
{
private int _virtualRecordCount;
public int VirtualRecordCount
{
get { return _virtualRecordCount; }
set { _virtualRecordCount = value; }
}
public MyEntityList()
{
}
public MyEntityList(MyEntity[] arr)
{
AddRange(arr);
}
public MyEntityList this[int index]
{
get { return (MyEntity)InnerList[index]; }
}
public void Add(MyEntity item)
{
InnerList.Add(item);
}
etc...
我已经升级了应用程序的一层以使用泛型Collection<T>
作为返回类型。该层是自动生成的,类名基于数据源表名。业务实体类也不需要排队,但在这种情况下并非如此。在这种情况下,它们完美匹配 1:1。
我尝试像这样映射集合:
Collection<MyEntityResponse> responses = GetMyEntityResponses();
AutoMapper.Mapper.CreateMap<MyEntityResponse, MyEntity>();
myEntityList = AutoMapper.Mapper.Map<MyEntityList>(responses);
最奇怪的事情......我以为它可能会在使用时发出尖叫声CollectionBase
,但我还是按了 F5。令我惊讶的是,没有编译器错误,也没有例外。哇哦!
但是,稍后在应用程序中,当它尝试执行从Mapper.Map 返回的操作时,它抛出了一个异常,抱怨类型转换 from MyEntityResponse
to 。MyEntity
foreach()
MyEntityList
发生的事情是MyEntityList
返回了一个新集合,但其中充满了MyEntityResponse
对象。啊??自定义集合覆盖该Add()
方法并指定类型必须是 type MyEntity
。我希望它在尝试将错误的类型添加到集合时会爆炸,但它似乎没有任何问题与CollectionBase
.
所以我的问题是,如果我尝试映射的两种类型完美匹配(属性到属性),并且 AutoMapper 没有 CollectionBase 问题,为什么它不能映射实体?为什么它不抛出异常而不是将错误的类型推入集合?
编辑:我想我知道为什么......因为非泛型集合没有与之关联的已知类型,就像泛型集合一样。
所以,新问题......我如何告诉它使用MyEntity
而不是MyEntityResponse
?