且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

泛型集合中对继承类的转换

更新时间:2022-09-15 23:27:57

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

 

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

 


本文转自today4king博客园博客,原文链接:http://www.cnblogs.com/jinzhao/archive/2012/02/07/2341284.html,如需转载请自行联系原作者