将列表类型转换为IEnumerable接口类型

时间:2013-02-25 16:39:57

标签: c#

我有一个

List<Person> personlist; 

如何转换为

IEnumerable<IPerson> iPersonList

Person实现IPerson接口

3 个答案:

答案 0 :(得分:28)

如果您使用的是.NET 4.0或更高版本,则可以进行隐式转换:

IEnumerable<IPerson> iPersonList = personlist;
//or explicit:
var iPersonList = (IEnumerable<IPerson>)personlist;

这会在IEnumerable<out T>中使用通用的逆转 - 即因为您只获得IEnumerable out ,您可以隐式地将IEnumerable<T>转换为{{1}如果IEnumerable<U>。 (它也使用T : U。)

否则,您必须使用LINQ:

来转换每个项目
List<T> : IEnumerable<T>

答案 1 :(得分:4)

您可以使用IEnumerable.Cast

var iPersonList = personlist.Cast<IPerson>();

答案 2 :(得分:0)

从.NET 4.0开始,您可以将List<Person>传递给参数类型为IEnumerable<IPerson>的方法,而无需隐式或显式转换。

由于contravariance

,隐式投射会自动完成(如果可能)

你可以这样做:

var people = new List<Person>();
// Add items to the list

ProcessPeople(people); // No casting required, implicit cast is done behind the scenes


private void ProcessPeople(IEnumerable<IPerson> people)
{
// Processing comes here
}