代码之家  ›  专栏  ›  技术社区  ›  LorenVS

通过重写链的IEnumerable列表

  •  10
  • LorenVS  · 技术社区  · 15 年前

    好吧,很难说这个问题的确切标题,但这里……我有一个名为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 回复  |  直到 15 年前
        1
  •  5
  •   Community CDub    7 年前

    你必须做一些类似foreach方法的事情,因为 base.GetDefaultUsages() 返回IEnumerable。 yield return 处理单个项目,而不是集合。不过如果 生利 无法返回对象集合。

    两周前约翰·奥克斯利问 similar question .

    编辑: 巴特·雅各布斯、埃里克·迈耶、弗兰克·皮森斯和沃尔夫拉姆·舒尔特似乎已经写过 a very interesting paper 关于他们称之为嵌套迭代器的东西,这基本上就是您所要求的。