首页 新闻 会员 周边

泛型List的继承

0
悬赏园豆:10 [已解决问题] 解决于 2009-12-23 11:12

在.net2.0中 Class A:Class B

List<B> listB as List<A> ListA  不能通过编译器,你们是怎么解决的?

必须将listB 转换为 IList 或者 object ?

问题补充: 一个糊涂的问题,源于对泛型的生疏
KAI168的主页 KAI168 | 初学一级 | 园豆:41
提问于:2009-12-22 16:16
< >
分享
最佳答案
0

lz明明说的是2.0嘛,哪里来的Cast方法?。。。

lz可以自行编写一个Cast方法,遍历List<A>,把每个A转换成B,如 

static IEnumerable<TResult> Cast<TResult>(IEnumerable source) where TResult : class
{
foreach (object o in source)
{
TResult result
= o as TResult;
if (o == null)
throw new InvalidCastException("can't cast");
yield return result;
}
}

 

A虽然继承于B,但是List<A>与List<B>并不存在继承关系。 

收获园豆:10
麒麟.NET | 老鸟四级 |园豆:3614 | 2009-12-23 10:43
前提 A继承于B,请告诉我一个理由为什么 List<A>不应该继承于List<B>?(假如编译器由你来写,我想不通为什么List<A>不隐式继承于List<B>?)呵呵
KAI168 | 园豆:41 (初学一级) | 2009-12-23 10:59
其他回答(4)
0

listB.Cast<A>().ToList()

Jeffrey Zhao | 园豆:1629 (小虾三级) | 2009-12-22 16:42
感谢你的回答!很遗憾,List<T>.Cast<A>() 不在.net2.0中.不过找到ConvertAll<TOutput>(Converter<T, TOutput> converter),(貌似重构了一个List,可能有性能问题), 请问 ListA _listA=(List<B> as object) as ListA,在几百个Item的情况下,性能是否可以忽略?
支持(0) 反对(0) KAI168 | 园豆:41 (初学一级) | 2009-12-23 10:39
ListA _listA=(List<B> as object) as ListA 错误,sorry!
支持(0) 反对(0) KAI168 | 园豆:41 (初学一级) | 2009-12-23 10:52
0

List<B> listB as List<A> ListA 

A与B不是同类的,

 

 

 

一滴血 | 园豆:1602 (小虾三级) | 2009-12-22 18:20
我就很郁闷,List<B>虽然不是继承自List<A>,既然class B:class A,为什么不隐式 List<B>:List<A> 呢?
支持(0) 反对(0) KAI168 | 园豆:41 (初学一级) | 2009-12-23 10:42
0

listB.Cast<A>().ToList()

紫色永恒 | 园豆:844 (小虾三级) | 2009-12-23 08:35
listB.ConvertAll(a=>{return a as A;})
支持(0) 反对(0) 疯流成性 | 园豆:3 (初学一级) | 2009-12-24 09:38
listB.Cast<A>().ToList(),这个对了,神啊,我试了好久,用(List<A>)直接转就不行,一定要cast方法!oh,终于可以睡了。谢谢紫色永恒!
支持(0) 反对(0) 佳乐比海 | 园豆:70 (初学一级) | 2011-07-25 03:03
0

虽然已经解决了,但,既然看到了,还是回答一下吧。

 

2.0是不存在Cast这个方法,因为这个是LinQ里的,但是可以自己去写这个方法。具体的写法,你可以去反编译3.0以后的这个方法。其实也很简单,就是定义了一个新的List<B>对象listB,然后,把listA里的每一个元素都填充到listB中,没有什么技巧的。

对于你提的这个问题,我猜测你的一个目的:希望listA和listB能通用,前面有朋友说明了,它们根本就是不同的一个类,没办法转换,即便通过中间对象object进行两次转换也是不成功的(目标对象会变成空)。

关于你的这个需求,可以参考我的随笔集合代理类的实现

无之无 | 园豆:5095 (大侠五级) | 2011-11-11 09:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册