2012-08-01 95 views
0

我有一个类heirarсhy派生类的实例:扩展方法,它返回

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 
using MyProject.Models; 
using MyProject.Extensions; 

namespace MyProject.Models 
{ 
    public abstract class Vehicle 
    { 
     public string Color { get; set; } 
    } 

    public class Car : Vehicle 
    { 
     public int Mileage { get; set; } 
    } 

    public class Boat : Vehicle 
    { 
     public int Displacement { get; set; } 
    } 

} 


namespace MyProject.Extensions 
{ 
    public static class VehicleExtensions 
    { 
     public static IEnumerable<Vehicle> FilterByColor(this IEnumerable<Vehicle> source, string color) 
     { 
      return source.Where(q => q.Color == color); 
     } 
    } 
} 

namespace MyProject.Controllers 
{ 
    public class IndexController : Controller 
    { 
     public ActionResult Index() 
     { 
      List<Car> cars = new List<Car>(); 
      cars.Add(new Car() { Color = "white", Mileage = 10000 }); 
      cars.Add(new Car() { Color = "black", Mileage = 20000 }); 

      IEnumerable<Car> filtered = cars.FilterByColor("black");   
       // Compile error, can not cast IEnumerable<Vehicle> to IEnumerable<Car> 

       //.OfType<Car>() - only this helps. I`m looking for another ways 

      return View(filtered); 
     } 
    } 
} 

我想在IEnumerable<Car>使用的扩展方法,并从中获得IEnumerable<Car>但方法返回IEnumerable<Vehicle>,因为它的工作原理在所有派生类 - 编译错误。我只知道解决这个问题的方法之一是添加电话.OfType<Car>(),但这是一种首选方式吗?可能有更好的方法吗?

回答

5

我怀疑你只是想使其与约束的一般方法,以确保该类型参数为Vehicle或子类:

public static IEnumerable<T> FilterByColor<T>(this IEnumerable<T> source, 
    string color) where T : Vehicle 
{ 
    return source.Where(q => q.Color == color); 
} 
+0

非常感谢你。 – Roman 2012-08-01 18:24:31

3

你需要使它通用:

public static IEnumerable<T> FilterByColor(this IEnumerable<T> source, string color) where T : Vehicle 
+0

非常感谢。 – Roman 2012-08-01 18:25:13

+0

只是语法上的一个小错误 - 应该是FilterByColor ,否则“where”不起作用。 – Roman 2012-08-01 18:47:54