Начиная с C # 2.0, мы можем объявлять блоки итераторов внутри классов и возвращать значения из них, используя ключевые слова yield return
. За кулисами компилятор щедро преобразовал наш довольно простой блок итератора в свой собственный класс, конечный автомат, который полностью реализует интерфейс IEnumerable
или IEnumerator
. Используя ILSpy или Reflector, вы можете получить представление о том, как выглядят эти классы.
В C # 3.5 к языку были добавлены методы расширения, обеспечивающие простые средства написания статических методов, которые появятся во всплывающем окне intellisense существующих классов или интерфейсов.
Что мне интересно, так это объединение этих двух концепций, и при этом у меня трудное время. Мое разочарование связано с тем фактом, что в блоке итератора ключевое слово this
ссылается на класс, в котором находится блок итератора, а не на класс, сгенерированный компилятором, который содержит реализацию блока итератора.
Я хотел бы сделать что-то вроде этого:
public static class IteratorExtensions
{
public static void DoSomething<T>(this IEnumerable<T> iterator)
{
Console.WriteLine("Running iterator block of type :" + typeof(T).Name);
}
}
public class IteratorExample
{
public IEnumerable<string> MyIterator()
{
yield return "Hello";
this.DoSomething();
yield return "World";
}
}
К сожалению, в этом контексте this
относится к экземпляру IteratorExample, а не к экземпляру сгенерированного класса MyIterator. Есть ли способ получить ссылку в итераторе или мне придется пересмотреть свои планы?