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();