从泛型集合到非泛型集合

时间:2012-07-09 22:11:47

标签: c# collections automapper

我在较旧的应用程序中工作(从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

1 个答案:

答案 0 :(得分:1)

我想我找到了答案:http://automapper.codeplex.com/wikipage?title=Lists%20and%20Arrays

  

对于非泛型可枚举类型,仅限未映射的可分配类型   支持,因为AutoMapper将无法“猜测”什么类型   你正试图映射。如上例所示,事实并非如此   显式配置列表类型所必需的,只需要它们的成员类型。

     

从版本0.2.0开始,没有自定义目标集合类型   支撑。