好吧,很难说出这个问题的确切标题,但是这里......我有一个名为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)。
任何人都有任何关于实现这个的好方法的想法???
答案 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关于他们称之为嵌套迭代器的东西,这基本上就是你所要求的。