如果您出現以下錯誤,本文可能對你有幫助:
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
<a></a>
[Fact]
public void Convert()
{
object bList = new List<BClass>() {new BClass(), new BClass()};
var ret=(List<AClass>) bList;//這裡編譯通過但是List<AClass>和List<BClass>不具備繼承關系
}
如果改成這樣是可以的
var ret = ((List<BClass>)bList).Cast<AClass>();//這樣是可以的
可是有那麼多跟BClass一樣的子類就不太可行了,我的第一個嘗試是反射:
[Fact]
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
這到底是為什麼呢??等等,上面的代碼怎麼看着有點别扭。。。,恍然大悟,可以寫成這樣:
var ret = ((IEnumerable)bList).Cast<AClass>(); //順眼多了,這裡運作通過
好了,通過了,那麼error2為什麼會出現呢?^_^
說明:
object bList = new List<BClass>() {new BClass(), new BClass()};//這裡是模拟反射出來的一個BCalss
這個方法要應用于AClass的所有子類,像BCalss這樣的不隻一個,不可能每一個都轉一下,需要直接傳回List<AClass>;
本文轉自today4king部落格園部落格,原文連結:http://www.cnblogs.com/jinzhao/archive/2012/02/07/2341284.html,如需轉載請自行聯系原作者