使用object` `返すために親の型としてキャストが、許可します設定例:は、派生型が派生型の(私はコンパイルされません知っていると正しくない)次のコードを考える方法
var myFetchers = new List<Fetcher> {
new Fetcher<string>(() => new List<string> { "white", "black" })),
new Fetcher<int>(() => new List<int> { 1, 2 }))
};
これを行うにはどうすればよいでしょうか?
IEnumerable<IEnumerable<object>> fetcherResults =
myFetchers.Select(fetcher => fetcher.Fetch()); // get objects from derived method
TLDR。私はこれについてもう少し考えました。私の質問を述べる別の方法は、リスト内のすべてのアイテムに対してFetch
メソッドを実行し、各アイテムの基本タイプを特定することなく、そのタイプのキャストを行うことなく、 Fetch
メソッド自体からIEnumerable<object>
を返さないでください。
ここで重要なのは、異なるジェネリックタイプのオブジェクトが親タイプのコレクションにあるとき、派生したタイプのメソッドを実行したいが結果はで、IEnumerable<T>
ではなく返すようにしたい。 (これは必要ならば別の方法を使って行うことができますが、同じ名前であればいいと思いますが)これは、フェッチャについて知る必要のないコードの部分がそのデータを持つことができるようにするためです(そしてちょうどfetcherResults
を渡す)が、フェッチャーを気にするコードの部分は、フェッチャーがどのタイプのデータを扱うかを完全に無視することができます(懸念事項ではなく、データの消費者のみがその特定のタイプで動作する必要があります)。
私はここで継承を使用する必要はなく、インターフェイスIFetcher
も同様に機能します。私は、明示的なインターフェイスの実装が役立つかもしれない方法を考え続けて、私はちょうど私のためにこの作品の作り方を今すぐループを閉じていないよ。いつものように
// in a class implementing ICollection<T>
public IEnumerator<T> GetEnumerator() => _collection.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable) _collection).GetEnumerator();
を、実際の状況は、このような(これよりも複雑ですフェッチャがデータベースから提供しているデータなど)。しかし、この1つの部分をダウンさせることは、私が必要とするものすべてになります。
私は以下のリソースを無駄に見ています:implement an inheritable method that returns an object、call method on generic type from abstract parent。私が正しく質問を理解していれば
'FetchGeneric()。キャスト
私はそれらを同じ名前にしたいと思って捨てられたと思う。今あなたが言及していることははっきりしているようです。しかし、後で派生型を使用するときにフェッチを延期することにした場合、同じメソッド名を使用して特定の型を取得できることは間違いありません。 – ErikE
質問を更新しました。TLDRを開始する新しい段落を参照してください。 – ErikE