IEnumerable список через цепочку переопределения - PullRequest
10 голосов
/ 26 августа 2009

Хорошо, сложно сформулировать точное название для этого вопроса, но здесь идет ... У меня есть абстрактный класс с именем Block, который выглядит примерно так:

public abstract class Block
{
   public bool Enabled{get; private set;}

   public virtual IEnumerable<KeyValuePair<string, string>> GetDefaultUsages()
   {
      yield return new KeyValuePair<string, string>("Enabled", "true");
   }
}

И скажи, что у меня есть подкласс:

public class Form : Block
{
   public string Key{get; private set;}

   public override IEnumerable<KeyValuePair<string, string>> GetDefaultUsages()
   {
       yield return new KeyValuePair<string,string>("Key", string.Empty);

       // can't do: yield return base.GetDefaultUsages()
   }
}

Идея состоит в том, что GetDefaultUsages () всегда будет возвращать IEnumerable, содержащий все строки строк, пары строк, которые были указаны во всей цепочке наследования. Сначала я надеялся, что ключевое слово yield будет поддерживать такое утверждение, как:

yield return (some IEnumerable<T> object);

Но, видимо, это не работает. Я понимаю, что я мог сделать:

foreach(KeyValuePair<string, string> kv in base.GetDefaultUsages())
{
   yield return kv;
}

Но я надеялся на немного более чистый синтаксис (и избегал создания всех ненужных промежуточных IEnumerators).

Кто-нибудь получил какие-либо идеи о хорошем способе реализации этого ???

1 Ответ

5 голосов
/ 26 августа 2009

Вы должны сделать что-то вроде метода foreach, потому что base.GetDefaultUsages() возвращает IEnumerable. yield return имеет дело с отдельными предметами, а не с коллекциями. Хотя было бы неплохо, если бы yield return мог вернуть коллекцию объектов.

2 недели назад Джон Оксли задал похожий вопрос .

Edit: Похоже, что Барт Джейкобс, Эрик Мейер, Фрэнк Писсенс и Вольфрам Шульте уже написали очень интересную статью о том, что они называют вложенными итераторами, и это, в основном, то, что вы просите.

...