C# 3.0 基于接口过滤具体类型列表的扩展方法?

C# 3.0 基于接口过滤具体类型列表的扩展方法?,c#-3.0,extension-methods,C# 3.0,Extension Methods,我有一个实现接口的多个类。我想创建一个扩展方法,根据一个值过滤这些类的列表。下面是一个假设的例子: public enum Transmission { Standard = 1, Automatic = 2 } public interface ICar { Transmission Tranny { get; set; } } public class Car : ICar { public Transmission Tranny { get; set;

我有一个实现接口的多个类。我想创建一个扩展方法,根据一个值过滤这些类的列表。下面是一个假设的例子:

public enum Transmission
{ 
    Standard = 1,
    Automatic = 2
}

public interface ICar
{
    Transmission Tranny { get; set; }
}

public class Car : ICar
{
    public Transmission Tranny { get; set; }
    public string Make { get;set;}
}

public static class CarExtensions
{
    public static List<ICar> OnlyAuto(this List<ICar> cars)
    {
        return cars.Where(x => x.Tranny == Transmission.Automatic).ToList();
    }
}
公共枚举传输
{ 
标准=1,
自动=2
}
公共接口ICar
{
传输传输{get;set;}
}
公车:ICar
{
公共传输传输{get;set;}
公共字符串Make{get;set;}
}
公共静态类CarExtensions
{
仅限公共静态列表自动(此列表车辆)
{
return cars.Where(x=>x.Tranny==Transmission.Automatic).ToList();
}
}
我想创建一个扩展方法来过滤汽车列表…但这个方法不适用于

var x = new List<Car>();
x.OnlyAuto <-- compile error...
var x=新列表();

x、 OnlyAuto这个问题并不是特定于扩展方法的。根据示例中的定义,以下结果将导致编译器错误:

void DoStuff(List<ICar> cars)
{
}

DoStuff(new List<Car>());
或添加以下扩展方法:

public static IEnumerable<ICar> OnlyAuto(this IEnumerable<ICar> cars)
{
   return cars.Where(x => x.Tranny == Transmission.Automatic).ToList();
}
仅限公共静态IEnumerable自动(此IEnumerable汽车)
{
return cars.Where(x=>x.Tranny==Transmission.Automatic).ToList();
}
并使用Cast:

var x = new List<Car>();
(x.Cast<ICar>()).OnlyAuto();
var x=新列表();
(x.Cast())。仅限自动();
如果你在谷歌上搜索“C#协方差”,你会发现很多人都写过关于这个问题的文章。在c#4.0中,IEnumerable似乎是协变的,这意味着可以在上面的示例中取消使用
Cast

var x = new List<Car>();
(x.Cast<ICar>()).OnlyAuto();