0

私はクラス階層を持っています:

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>これを修正する唯一の方法は call を追加することです.OfType<Car>()が、これは好ましい方法ですか? より良い方法があるかもしれませんか?

4

2 に答える 2

5

Vehicle型パラメーターがまたはサブクラスであることを保証するために、制約付きのジェネリックメソッドにしたいだけだと思います。

public static IEnumerable<T> FilterByColor<T>(this IEnumerable<T> source, 
    string color) where T : Vehicle
{
    return source.Where(q => q.Color == color);
}
于 2012-08-01T17:30:17.887 に答える
3

汎用にする必要があります。

public static IEnumerable<T> FilterByColor(this IEnumerable<T> source, string color) where T : Vehicle
于 2012-08-01T17:30:37.777 に答える