2

それぞれがさまざまなタイプの 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 を使用しています。

4

1 に答える 1