IEnumerable列表通过覆盖链

Lor*_*nVS 10 .net c# 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");
   }
}
Run Code Online (Sandbox Code Playgroud)

并说我有一个子类:

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()
   }
}
Run Code Online (Sandbox Code Playgroud)

我们的想法是,GetDefaultUsages()将始终返回一个IEnumerable,其中包含通过整个继承链指定的所有字符串,字符串对.我最初希望yield关键字支持如下语句:

yield return (some IEnumerable<T> object);
Run Code Online (Sandbox Code Playgroud)

但显然这不起作用.我意识到我能做到:

foreach(KeyValuePair<string, string> kv in base.GetDefaultUsages())
{
   yield return kv;
}
Run Code Online (Sandbox Code Playgroud)

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

任何人有任何想法的好方法来实现这个???

Joh*_*esH 5

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

2周前,约翰奥克斯利问了一个类似的问题.

编辑: 似乎Bart Jacobs,Eric Meyer,Frank Piessens和Wolfram Schulte已经写了一篇非常有趣的论文,他们称之为嵌套迭代器,这基本上就是你所要求的.