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

  • 相关阅读:
    PHP 学习轨迹
    beego 遇到的一些问题
    Fiddler 502问题
    SourceTree
    Trait
    PHP PSR 标准
    解决MySQL联表时出现字符集不一样
    Git 代码管理命令
    PHP 运行相关概念
    CentOS 7
  • 原文地址:https://www.cnblogs.com/jinzhao/p/2341284.html
Copyright © 2011-2022 走看看