我在较旧的应用程序中工作(从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。令我惊讶的是,没有编译错误也没有异常。哇噢!
但是,稍后在应用程序中,当它尝试在MyEntityResponse
上执行MyEntity
时,会引发一个例外,抱怨从foreach()
到MyEntityList
的类型转换来自Mapper.Map。
发生的事情是返回了一个新的MyEntityList
集合,但它填充了MyEntityResponse
个对象。咦?自定义集合会覆盖Add()
方法,并指定类型必须是MyEntity
类型。我希望在尝试向集合中添加错误类型时它会爆炸,但似乎没有任何问题与CollectionBase
一起使用。
所以我的问题是,如果我想要映射的两种类型完全匹配(属性到属性),而AutoMapper没有CollectionBase的问题,为什么它无法映射这些内容?为什么不抛出异常而不是将错误的类型推入集合中呢?
编辑:我想我知道为什么......因为非泛型集合没有与之相关的已知类型,就像通用集合那样。
那么,新问题......如何告诉它使用MyEntity
代替MyEntityResponse
?
答案 0 :(得分:1)
我想我找到了答案:http://automapper.codeplex.com/wikipage?title=Lists%20and%20Arrays
对于非泛型可枚举类型,仅限未映射的可分配类型 支持,因为AutoMapper将无法“猜测”什么类型 你正试图映射。如上例所示,事实并非如此 显式配置列表类型所必需的,只需要它们的成员类型。
从版本0.2.0开始,没有自定义目标集合类型 支撑。强>