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

  • 相关阅读:
    Command模式应用实践
    .Net中的设计模式——Strategy模式
    PetShop之ASP.NET缓存
    征求书名
    PetShop之业务逻辑层设计
    Buider模式应用实践
    公告:目前博客园书业出版小组的工作进度
    “AS3.0高级动画编程”学习:第二章转向行为(下)
    as3: this,stage,root的测试
    As3.0中的位图(Bitmap/BitmapData)编程
  • 原文地址:https://www.cnblogs.com/jinzhao/p/2341284.html
Copyright © 2011-2022 走看看