博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
泛型集合中对继承类的转换
阅读量:6996 次
发布时间:2019-06-27

本文共 1667 字,大约阅读时间需要 5 分钟。

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

 

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(
null
new 
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/archive/2012/02/07/2341284.html

你可能感兴趣的文章
IC卡读卡器web开发,支持IE,Chrome,Firefox,Safari,Opera等主流浏览 器
查看>>
CSS3: box-sizing 属性的简单认识
查看>>
Python3.2 --- Print函数用法
查看>>
常用工具说明--Java的常用工具
查看>>
C++中几个值得分析的小问题(1)
查看>>
【LeetCode 104_二叉树_遍历】Maximum Depth of Binary Tree
查看>>
Android zxing扫描二维码 为什么有些机型扫描不出来或者很慢?
查看>>
js-循环执行一个函数
查看>>
HDU 4720 Naive and Silly Muggles (简单计算几何)
查看>>
linux终端快捷键
查看>>
基础数据类型的补充和深浅copy
查看>>
20160327javaweb 之JSP入门
查看>>
NFS 挂载时提示:Root-NFS: Server returned error -13
查看>>
python整理&&集合学习
查看>>
深入浅出Node.js (10) - 测试
查看>>
如何在列表,字典,集合中根据条件筛选数据
查看>>
hibernate中文乱码问题
查看>>
006- 软件产品质量特性是什么?
查看>>
图片占位
查看>>
bs4 python解析html
查看>>