IEnumerable列表通过覆盖链

时间:2009-08-26 02:59:01

标签: c# .net ienumerable

好吧,很难说出这个问题的确切标题,但是这里......我有一个名为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;
}

但是我希望语法稍微清晰(并避免创建所有不必要的中间IEnumerator)。

任何人都有任何关于实现这个的好方法的想法???

1 个答案:

答案 0 :(得分:5)

你必须做类似foreach方法的事情,因为base.GetDefaultUsages()返回一个IEnumerable。 yield return处理单个项目,而不是集合。虽然如果yield return可以返回一个对象集合会很好。

2周前John Oxley问similar question

修改 似乎Bart Jacobs,Eric Meyer,Frank Piessens和Wolfram Schulte已经写了a very interesting paper关于他们称之为嵌套迭代器的东西,这基本上就是你所要求的。