2009-08-26 10 views
10

In Ordnung, hart Begriff eine genaue Bezeichnung für diese Frage, aber hier geht ... Ich habe eine abstrakte Klasse namens Block, die etwa wie folgt aussieht:IEnumerable Liste durch Überschreibung Kette

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"); 
    } 
} 

Und ich sage haben eine Unterklasse:

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() 
    } 
} 

die Idee ist, dass GetDefaultUsages() wird immer eine IEnumerable enthält alle String, String-Paaren, die durch die gesamte Vererbungskette specififed wurden. Ich hatte gehofft, zunächst, dass die Ausbeute Schlüsselwort eine Anweisung wie unterstützen würde:

yield return (some IEnumerable<T> object); 

Aber anscheinend das funktioniert nicht. Ich weiß, dass ich tun konnte:

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

Aber ich hatte gehofft, für eine etwas sauberere Syntax (und alle unnötigen Zwischen IEnumerators vermieden erstellen).

Wer hat irgendwelche Ideen von einem guten Weg, dies zu implementieren ???

+0

+1 für eine gute Frage – JohannesH

+0

möglich Duplikat von [Nested yield return mit IEnumerable] (http://stackoverflow.com/questions/1270024/nested-yield-return-with-ienerable) – nawfal

Antwort

5

Sie müssen etwas wie die Foreach-Methode tun, weil die base.GetDefaultUsages() einen IEnumerable zurückgeben. yield return befasst sich mit einzelnen Elementen, nicht Sammlungen. Es wäre zwar nett, wenn yield return eine Sammlung von Objekten zurückgeben könnte.

vor 2 Wochen John Oxley fragte eine similar question.

Edit: Es scheint, dass Bart Jacobs, Eric Meyer, Frank Piessens und Wolfram Schulte schrieb bereits a very interesting paper über etwas, das sie verschachtelte Iteratoren nennen, das ist im Grunde, was Sie fragen.

+0

Ist das nicht genau was Ich sagte in der Frage? – LorenVS

+0

Yup, Ertrag foreach ist noch nicht da. Siehe http://blogs.msdn.com/wesdyer/archive/2007/03/23/all-about-iterators.aspx für einige Diskussion –

+0

Ja und meine Antwort bestätigt Ihre Lösung für das Problem. Eine foreach, die die Basissammlung aufzählt, ist die Lösung bis jetzt. Hoffentlich unterstützt C# in Zukunft wiederkehrende Sammlungen mit Rendite. – JohannesH