2

我有一个模型,其中我有一个抽象类(我们称之为Vehicle)和几个继承的类,例如BikeMotorbikeCarVan。这本质上是现实世界问题的简化版本。

abstract class Vehicle
    int ID;
    int WheelCount;
    string OwnerName;

class Bike
    DateTime lastSafetyCheck;

class Motorbike
    int EngineCC

class Car
    double EngineSize

class Van
    double StorageCapacity

我的系统中有一个IEnumerable<Vehicle>包含其中每一个的。这包含在线程安全的单例类中,本质上充当内存数据库。

我希望在我的应用程序中有一个方法(在单例或单独的类中),它允许我只查询某种类型的车辆。

最初我考虑了一种方法,例如:

internal IEnumerable<T> GetVehicles<T>() where T : Vehicle

为了能够提供一种类型T,该类型将指定我希望检索的类型。我知道我可以使用 typeof() 来执行逻辑。但我不知道如何返回我的值?我基本上在方法的内容上苦苦挣扎,我开始认为肯定有一种设计模式会更有意义。

AK

4

3 回答 3

6

LINQ 已经有这个方法 - OfType

var vans = Vehicales.OfType<Van>();

顺便说一句,要确定一个实例是否是您不需要使用的类型的实例typeof(),您可以使用isas运算符(它们也可以与泛型类型一起使用):

if (vehicle is Van) ...
if (vehicle is T) ...

或者

var van = vehicle as Van;
if (van != null) ...

var instance = vehicle as T; // Will need T : class generic type constraint
if (instance != null) ...

var instance = vehicle as T?; // Will need T : struct generic type constraint
if (instance != null) ...
于 2012-07-12T09:16:07.933 回答
2

为什么不直接使用OfType()

来自MSDN

根据指定类型过滤 IEnumerable 的元素。


您的代码可能如下所示:

internal IEnumerable<T> GetVehicles<T>() where T : Vehicle
{
    return AllVehicles.OfType<T>();
}
于 2012-07-12T09:16:35.423 回答
1

如果您有一个 Vehicles 的集合,并且您的方法返回一个 IEnumerable,那么您应该能够运行以下命令

var cars = GetVehicles().OfType<Car>();

这样,您的方法 GetVehicles 不需要执行任何逻辑,您可以在 Linq 调用中按类型进行过滤。

于 2012-07-12T09:22:34.147 回答