zoukankan      html  css  js  c++  java
  • 泛型集合中对继承类的转换

    如果您出现以下错误,本文可能对你有帮助:

    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

            [Fact]
            public void Convert()
            {
                object bList = new List<BClass>() {new BClass(), new BClass()};
                var ret=(List<AClass>) bList;//这里编译通过但是List<AClass>和List<BClass>不具备继承关系
            }

     如果改成这样是可以的

            [Fact]
            public void Convert()
            {
                object bList = new List<BClass>() {new BClass(), new BClass()};
                var ret = ((List<BClass>)bList).Cast<AClass>();//这样是可以的
            }

     可是有那么多跟BClass一样的子类就不太可行了,我的第一个尝试是反射:

    [Fact]
            public void Convert()
            {
                object bList = new List<BClass>() {new BClass(), new BClass()};
                MethodInfo castList = typeof(Enumerable)
                                              .GetMethod("Cast", BindingFlags.Public | BindingFlags.Static)
                                              .MakeGenericMethod(typeof(AClass));
                var ret = (List<AClass>)castList.Invoke(nullnew object[] {bList}); //看着应该没问题但是这里运行不通过
            }

     上面会引发Error 2

    这到底是为什么呢??等等,上面的代码怎么看着有点别扭。。。,恍然大悟,可以写成这样:

            [Fact]
            public void Convert()
            {
                object bList = new List<BClass>() {new BClass(), new BClass()};
                var ret = ((IEnumerable)bList).Cast<AClass>(); //顺眼多了这里运行通过
            }

     好了,通过了,那么error2为什么会出现呢?^_^

    说明:

    object bList = new List<BClass>() {new BClass(), new BClass()};//这里是模拟反射出来的一个BCalss

    这个方法要应用于AClass的所有子类,像BCalss这样的不只一个,不可能每一个都转一下,需要直接返回List<AClass>;

  • 相关阅读:
    数据中台实战(六):交易分析
    数据中台实战(五):自助分析平台(产品设计篇)
    数据中台实战(四):商品分析(产品设计篇)
    数据中台实战(三):用户分析(产品设计篇)
    数据中台实战(二):基于阿里OneData的数据指标管理体系
    数据中台实战(一):以B2B电商亿订为例,谈谈产品经理视角下的数据埋点
    LeetCode82. 删除排序链表中的重复元素 II
    LeetCode203. 移除链表元素
    LeetCode445. 两数相加 II
    LeetCode2. 两数相加
  • 原文地址:https://www.cnblogs.com/jinzhao/p/2341284.html
Copyright © 2011-2022 走看看