我有一个模型,我有一个抽象类(让我们称之为Vehicle
)和几个继承的类,例如Bike
,Motorbike
,Car
,{{这基本上是现实世界问题的简化版本。
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
答案 0 :(得分:6)
LINQ已经有了这种方法 - OfType:
var vans = Vehicales.OfType<Van>();
另外,要确定某个实例是否是某个类型的实例,您不需要使用typeof()
,您可以使用is和as运算符(他们可以也可以与泛型类型一起使用):
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调用中按类型过滤。