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

  • 相关阅读:
    目标检测的图像特征提取之(一)HOG特征
    压缩跟踪Compressive Tracking
    计算机视觉领域的一些牛人博客,研究机构等的网站链接
    运动检测(前景检测)之(二)混合高斯模型GMM
    最简单的目标跟踪(模版匹配)
    Kalman滤波器从原理到实现
    前景目标检测(总结)
    ViBe(Visual Background extractor)背景建模或前景检测
    paramiko不能通过cd改变路径分析
    SecureCRT SSH主机秘钥配置文件管理
  • 原文地址:https://www.cnblogs.com/jinzhao/p/2341284.html
Copyright © 2011-2022 走看看