2009-08-26 8 views
10

さてさて、この質問のためのハードフレーズに正確なタイトルによってリストが、ここに行く...私はこのようになり、ブロックと呼ばれる抽象クラス、持っている:IEnumerableをオーバーライドチェーン

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()は常に全体の継承チェーンを通じてspecififedれたすべての文字列、文字列のペアを含むIEnumerableをを返すことです。私は当初yieldキーワードが次のようなステートメントをサポートすることを望んでいました:

yield return (some IEnumerable<T> object); 

明らかにそれは動作しません。

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

しかし、私は少しきれいな構文を期待(およびすべての不要な中間IEnumeratorsを作成回避した):私は、私は何ができることを実現します。

誰でもこの方法を実装するには良い方法がありますか?

+0

+1良い質問のために – JohannesH

+0

[ネストされたyield return with IEnumerable](http://stackoverflow.com/questions/1270024/nested-yield-return-with-ienumerable) – nawfal

答えて

5

base.GetDefaultUsages()がIEnumerableを返すため、foreachメソッドのような処理が必要です。 yield returnは、コレクションではなく単一のアイテムを扱います。 yield returnがオブジェクトのコレクションを返すことができればいいですが。

2週間前John Oxleyさんがsimilar questionと尋ねました。

編集: バート・ジェイコブス、エリック・メイヤー、フランクPiessensその他とヴォルフラムシュルテは、すでにあなたが求めているものを基本的に彼らは、ネストされたイテレータを呼び出す何か、についてa very interesting paperを書いたようです。

+0

これは正確には何ですか私はその質問で言った? – LorenVS

+0

うん、収穫量foreachはまだありません。いくつかの議論については、http://blogs.msdn.com/wesdyer/archive/2007/03/23/all-about-iterators.aspxを参照してください。 –

+0

ええと私の答えは、問題に対するあなたの解決策を確認しています。ベースコレクションを列挙するforeachはこれまでの解決策です。うまくいけば将来的にはC#は利回りのあるコレクションを返すことをサポートします。 – JohannesH