我需要将List对象转换为另一个List对象,这是一个接口
public class THold : IHold
{..}
在这里,IHold是界面。
我想这样做:
List<THold> hold = new List<THold>();
List<IHold> test = hold;
答案 0 :(得分:6)
你最接近的是:
List<IHold> test = hold.Cast<IHold>().ToList();
问题在于不存在直播。如果我有以下内容怎么办?
public class THold : IHold { /* ... */ }
public class UHold : IHold { /* ... */ }
然后:
List<THold> holds = new List<THold>();
List<IHold> iholds = (List<IHold>) holds;
iholds.Add(UHold);
显然UHold
实现了IHold
接口,但显然也无法添加到THold
对象列表中。
答案 1 :(得分:1)
嗯,List<>
无法以非通用形式创建;我猜你在写帖子的时候丢了角括号。
无论如何,我猜你想要从List<THold>
转到List<IHold>
,反之亦然。无论哪种方式,最好的选择是Linq的OfType()方法:
List<THold> hold = new List<THold>();
//populate hold with items
List<IHold> test = hold.OfType<IHold>().ToList();
Cast<>()
方法也应该有效,但是每当我尝试使用它来执行其声明的任务时它就无法正常工作。使用具有投射每个项目的投影的Select()也将起作用:
List<IHold> test = hold.Select(x=>(IHold)x).ToList();
答案 2 :(得分:0)
这篇msdn文章描述了共同和逆变,这是你所描述的术语。