如果您出现以下错误,本文可能对你有帮助:
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>;