泛型集合中对继承类的转换
如果您出现以下错误,本文可能对你有帮助:
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>;