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>;

  • 相关阅读:
    (转)c++中NULL与nullptr的区别
    剑指offer:面试题1:赋值运算符函数
    剑指offer开篇
    立flag
    牛客网程序员面试金典:1.2——原串翻转(java实现)
    牛客网程序员面试金典:1.1确定字符互异(java实现)
    剑指Offer:面试题34——丑数(java实现)
    剑指Offer:面试题33——把数组排成最小的数(java实现)(未完待续)
    剑指Offer:面试题32——从1到n整数中1出现的次数(java实现)
    8种网站防盗链手段
  • 原文地址:https://www.cnblogs.com/jinzhao/p/2341284.html
Copyright © 2011-2022 走看看