それぞれがさまざまなタイプの T の ObservableCollection を返すメソッドのセットがあり、送信された列挙値に基づいてこれらのメソッドを返すファクトリ メソッドを記述できるようにしたいと考えています。たとえば、次のようなものがあるとします。非常に現実的な方法...
public ObservableCollection<Gribble> GetGribbles() {
return new ObservableCollection<Gribble>();
}
public ObservableCollection<Gribulator> GenerateGribulators() {
return new ObservableCollection<Gribulator>();
}
public ObservableCollection<Knepple> MakeKnepples() {
return new ObservableCollection<Knepple>();
}
...そして次の列挙型...
public enum ListNames {
Gribbles,
Gribulators,
Knepple
}
そしたらこんなことができるようになりたい…
Func<ObservableCollection<Gribble>> someGribbles =
MakeFunc<Gribble>(ListNames.Gribbles);
この理由は、このような署名を持つヘルパー クラスがあるためです...
public void GetList<T>(ListNames listName,
Func<ObservableCollection<T>> serviceCall,
Action<ObservableCollection<T>> handleList)
serviceCall はリストを取得するメソッドで、handleList はコールバック メソッドです。現時点では、このメソッドが呼び出されるたびに、コードはリストを取得する実際の関数を渡す必要があります。
ただし、コードの 2 つの部分が特定のリストに対して GetList を呼び出すと、2 つの異なるサービス呼び出しが渡される可能性があり、一貫性のない結果が生じる可能性があるため、これは設計上の不適切な選択であることが証明されています。GetList から呼び出される MakeFunc メソッドでサービス呼び出しをカプセル化したいと考えています。これは、GetList を使用するコードが実際のサービス呼び出しを認識しないため、間違ったことを実行できないことを意味します。
私はいくつかのことを試しましたが、コンパイルできるものを手に入れるのに苦労しています。私が持っている最も近いものは次のとおりです...
public Func<ObservableCollection<T>> MakeFunc<T>(ListNames listName) {
switch (listName) {
case ListNames.Gribbles:
return GetGribbles;
case ListNames.Gribulators:
return GenerateGribulators;
case ListNames.Knepple:
return MakeKnepples;
default:
throw new ArgumentException("Unknown list name");
}
}
...しかし、これにより、「GetGribbles() の戻り値の型が間違っています」という行に沿ってコンパイラ エラーが発生し、MakeFunc メソッドの GetGribbles の上にマウスを置くとポップアップするツールチップが表示されます。
'ObservableCollection<T> GetGribbles()'
署名付きのメソッドが必要です
私がやりたいことをすることは可能ですか?もしそうなら、私が間違ったことを説明できる人はいますか?
違いがあれば、Visual Studio 2010 で C# 4.0 を使用しています。