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

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

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

原文地址:https://www.cnblogs.com/jinzhao/p/2341284.html