2

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

发生的事情是MyEntityList返回了一个新集合,但其中充满了MyEntityResponse对象。啊??自定义集合覆盖该Add()方法并指定类型必须是 type MyEntity。我希望它在尝试将错误的类型添加到集合时会爆炸,但它似乎没有任何问题与CollectionBase.

所以我的问题是,如果我尝试映射的两种类型完美匹配(属性到属性),并且 AutoMapper 没有 CollectionBase 问题,为什么它不能映射实体?为什么它不抛出异常而不是将错误的类型推入集合?


编辑:我想我知道为什么......因为非泛型集合没有与之关联的已知类型,就像泛型集合一样。

所以,新问题......我如何告诉它使用MyEntity而不是MyEntityResponse

4

1 回答 1

1

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

对于非泛型可枚举类型,仅支持未映射的可分配类型,因为 AutoMapper 将无法“猜测”您要映射的类型。如上例所示,无需显式配置列表类型,只需配置其成员类型即可。

从 0.2.0 版开始,不支持自定义目标集合类型。

于 2012-07-09T22:25:44.700 回答