泛型集合中对继承类的转换
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                泛型集合中对继承类的转换
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                如果您出現以下錯誤,本文可能對你有幫助:
?
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
????????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
總結
以上是生活随笔為你收集整理的泛型集合中对继承类的转换的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Windows 编程
- 下一篇: 山重水复疑无路柳暗花明又一村(说一说山重
