天天看點

泛型集合中對繼承類的轉換

如果您出現以下錯誤,本文可能對你有幫助:

Error 1:System.InvalidCastException: Unable to cast object of type 'System.Collections.Generic.List`1[CNBlogs.Zzk.Tests.BClass]' to type 'System.Collections.Generic.List`1[CNBlogs.Zzk.Tests.AClass]'

Error 2:System.InvalidCastException: Unable to cast object of type 'System.Collections.Generic.List`1[CNBlogs.Zzk.Tests.BClass]' to type 'System.Collections.Generic.List`1[CNBlogs.Zzk.Tests.AClass]'.

 示例類:

    public class  AClass

    {}

    public class BClass:AClass

 錯誤使用Error 1

<a></a>

        [Fact]

        public void Convert()

        {

            object bList = new List&lt;BClass&gt;() {new BClass(), new BClass()};

            var ret=(List&lt;AClass&gt;) bList;//這裡編譯通過但是List&lt;AClass&gt;和List&lt;BClass&gt;不具備繼承關系

        }

 如果改成這樣是可以的

            var ret = ((List&lt;BClass&gt;)bList).Cast&lt;AClass&gt;();//這樣是可以的

 可是有那麼多跟BClass一樣的子類就不太可行了,我的第一個嘗試是反射:

[Fact]

            MethodInfo castList = typeof(Enumerable)

                                          .GetMethod("Cast", BindingFlags.Public | BindingFlags.Static)

                                          .MakeGenericMethod(typeof(AClass));

            var ret = (List&lt;AClass&gt;)castList.Invoke(null, new object[] {bList}); //看着應該沒問題,但是這裡運作不通過

 上面會引發Error 2

這到底是為什麼呢??等等,上面的代碼怎麼看着有點别扭。。。,恍然大悟,可以寫成這樣:

            var ret = ((IEnumerable)bList).Cast&lt;AClass&gt;(); //順眼多了,這裡運作通過

 好了,通過了,那麼error2為什麼會出現呢?^_^

說明:

object bList = new List&lt;BClass&gt;() {new BClass(), new BClass()};//這裡是模拟反射出來的一個BCalss

這個方法要應用于AClass的所有子類,像BCalss這樣的不隻一個,不可能每一個都轉一下,需要直接傳回List&lt;AClass&gt;;

本文轉自today4king部落格園部落格,原文連結:http://www.cnblogs.com/jinzhao/archive/2012/02/07/2341284.html,如需轉載請自行聯系原作者