与继承模型一起使用的最佳模式

时间:2012-07-12 09:13:08

标签: c# generics inheritance

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

Van

我的系统中有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 ,其中包含其中的每一个。它包含在线程安全的单例类中,基本上充当内存数据库。

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

最初我考虑过像这样的方法:

IEnumerable<Vehicle>

以便我能够提供一个类型internal IEnumerable<T> GetVehicles<T>() where T : Vehicle ,它将指定我想要检索的类型。我知道我可以使用typeof()来执行逻辑。但我无法弄清楚的是如何回报我的价值观?我基本上都在努力解决方法的内容,我开始认为必须有一个更有意义的设计模式。

AK

3 个答案:

答案 0 :(得分: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) ...

答案 1 :(得分:2)

为什么不使用OfType()

来自MSDN

  

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


您的代码可能如下所示:

internal IEnumerable<T> GetVehicles<T>() where T : Vehicle
{
    return AllVehicles.OfType<T>();
}

答案 2 :(得分:1)

如果你有一个Vehicle集合,而你的方法返回一个IEnumerable,你应该能够运行以下

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

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