泛型集合中对继承类的转换
如果您出现以下错误,本文可能对你有帮助:
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
{}
{}
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>不具备继承关系
}
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>();//这样是可以的
}
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}); //看着应该没问题,但是这里运行不通过
}
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>(); //顺眼多了,这里运行通过
}
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
出处:https://www.cnblogs.com/jinzhao/archive/2012/02/07/2341284.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
分类:
学习笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架