2012-07-09 115 views
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反正。令我驚奇的是,沒有編譯器錯誤,也沒有例外。哇噢!

然而,在後來的應用它引發了異常抱怨從MyEntityResponse類型轉換到MyEntity時嘗試執行上MyEntityList一個foreach()一個從Mapper.Map返回。

發生了什麼事是一個新的MyEntityList收集被返回,但它填充了MyEntityResponse對象。咦?自定義集合覆蓋Add()方法並指定該類型必須爲MyEntity。我希望在嘗試向集合中添加錯誤類型時會爆炸,但它似乎沒有任何與CollectionBase一起使用的問題。

所以我的問題是,如果我試圖映射的兩種類型匹配完美(屬性屬性),並且AutoMapper沒有CollectionBase的問題,爲什麼它不能映射內容?爲什麼它沒有拋出異常而不是將錯誤的類型推入集合中?


編輯:我想我知道爲什麼...因爲非泛型集合沒有與它相關的已知類型,就像泛型一樣。

因此,新的問題......我該如何告訴它使用MyEntity而不是MyEntityResponse

回答

1

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

對於非泛型枚舉類型,只有未映射,可分配的類型 支持,如AutoMapper將無法「猜測」 你是什麼類型的試圖映射。如上例所示,顯式配置列表類型(而不是其成員類型)不是 。

從版本0.2.0開始,不支持自定義目標集合類型 。