将对象列表转换为接口列表

时间:2010-01-04 05:42:36

标签: c# .net .net-3.5

如果我有objectA实现ISomeInterface

为什么我不能这样做:

List<objectA> list = (some list of objectAs . . .)

List<ISomeInterface> interfaceList = new List<ISomeInterface>(list);

为什么我不能将列表放入interfaceList构造函数中?有没有解决方法?

3 个答案:

答案 0 :(得分:23)

在C#3.0 + .Net 3.5及更高版本中,您可以通过执行以下操作来解决此问题

List<ISomeInterface> interfaceList = new List<ISomeInterface>(list.Cast<ISomeInterface>());

这不起作用的原因是在这种情况下List<ISomeInterface>的构造函数需要IEnumerable<ISomeInterface>。列表变量的类型只能转换为IEnumerable<objectA>。即使objectA可以转换为ISomeInterface,但IEnumerable<objectA>类型也无法转换为IEnumerable<ISomeInterface>

这在C#4.0中有所改变,它为语言添加了Co和Contravariance支持,并允许进行此类转换。

答案 1 :(得分:3)

最简单&amp;更简短的方法是:

var interfaceList = list.Cast<ISomeInterface>().ToList()

OR

List<ISomeInterface> interfaceList = list.Cast<ISomeInterface>().ToList()

以上两个示例代码相同,您可以使用您想要的每个代码...

答案 2 :(得分:1)

这是在C#4.0中处理的,你不能直接在C#3.5中这样做。你可以从这个列表中创建一个新的列表,然后使用扩展运算符或foreach干净地执行它,虽然比通过协方差逆向提供的类型转换慢(总是得到这些错误)在C#4中。