次のようなコードで
List<int> foo = new List<int>() { 1, 2, 3, 4, 5, 6 };
IEnumerable<int> bar = foo.Where(x => x % 2 == 1);
barSystem.Linq.Enumerable.WhereListIterator<int>遅延実行によるタイプです。実装しているため、 usingIEnumerable<int>に変換することができます。ただし、が呼び出されたときに実行されるコードの一部を特定できませんでした。私は dotPeek を逆コンパイラとして使用していますが、このようなことを試みるのはこれが初めてです。途中で間違いを犯した場合は修正してください。List<int>ToList()ToList()
これまでに見つけたことを以下に説明します (すべてのアセンブリはバージョン 4.0.0.0 です)。
Enumerable.WhereArrayIterator<TSource>アセンブリ内Enumerable.csの名前空間のファイルに実装されています。クラスはそれ自体を定義することも、実装することもありません。同じファイルにあるものを実装します。実装します。System.LinqSystem.CoreToList()IEnumerable<TSource>Enumerable.Iterator<TSource>Enumerable.Iterator<TSource>IEnumerable<TSource>ToList()にもある拡張メソッドですEnumerable.cs。それが行うのは、null チェックと、List<TSource>その引数でのコンストラクターの呼び出しだけです。List<T>アセンブリ内List.csの名前空間のファイルで定義されています。によって呼び出されるコンストラクターには、シグネチャがあります。もう一度 null チェックを行い、引数を にキャストします。コレクションに要素がない場合は、空の配列の新しいリストが作成されます。それ以外の場合は、メソッドを使用して新しいリストが作成されます。System.Collections.GenericmscorlibToList()public List(IEnumerable<T> collection)ICollection<T>ICollection.CopyTo()ICollection<T>はmscorlib\System.Collections.Generic\で定義されICollection.csます。IEnumerable汎用および非汎用の形式で実装されます。
これは私が立ち往生しているところです。どちらEnumerable.WhereArrayIterator<TSource>もEnumerable.Iterator<TSource>実装しないため、どこかでキャストを行う必要があり、が呼び出されたICollectionときに実行されるコードを見つけることができません。CopyTo()