在C#中转换List对象

时间:2011-05-16 17:41:41

标签: c# casting

我需要将List对象转换为另一个List对象,这是一个接口

public class THold : IHold
{..}

在这里,IHold是界面。

我想这样做:

List<THold> hold = new List<THold>();
List<IHold> test = hold;

3 个答案:

答案 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文章描述了共同和逆变,这是你所描述的术语。