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>、これらのそれぞれを含むがあります。これはスレッドセーフなシングルトンクラスに含まれており、基本的にインメモリデータベースとして機能します。

アプリケーションに(シングルトンクラスまたは個別のクラスのいずれかで)特定のタイプのVehicleのみをクエリできるメソッドが必要です。

当初、私は次のような方法を検討しました。

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

T取得したいタイプを指定するタイプを提供できるようにするためです。その後、ロジックを実行するためにtypeof()を使用できることを知っています。しかし、私が理解できないのは、自分の値を返す方法です。私は基本的にメソッドの内容に苦労していて、もっと意味のあるデザインパターンがそこにあるに違いないと思い始めています。

AK

4

3 に答える 3

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) ...
于 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 に答える