Ich habe eine IEnumerable<T>
Methode, mit der ich Steuerelemente auf einer WebForms-Seite finde.
Die Methode ist rekursiv und ich habe einige Probleme, den gewünschten Typ zurückzugeben, wenn yield return
der Wert des rekursiven Aufrufs zurückgegeben wird.
Mein Code sieht wie folgt aus:
public static IEnumerable<Control>
GetDeepControlsByType<T>(this Control control)
{
foreach(Control c in control.Controls)
{
if (c is T)
{
yield return c;
}
if(c.Controls.Count > 0)
{
yield return c.GetDeepControlsByType<T>();
}
}
}
Dies löst derzeit den Fehler "Ausdruckstyp kann nicht konvertiert werden" aus. Wenn diese Methode IEnumerable<Object>
jedoch den Typ zurückgibt , wird der Code erstellt, aber der falsche Typ wird in der Ausgabe zurückgegeben.
Gibt es eine Möglichkeit yield return
, Rekursion zu verwenden?
if(c.Controls.Count > 0)
-> if(c.Controls.Any())
, besonders wenn Sie auch nachgeben :)
yield
. Bitte siehe unten :) Und es ist auch ein
yield return
bei rekursiven Funktionen zu vermeiden , dass die Speichernutzung explosionsartig skaliert. Siehe stackoverflow.com/a/30300257/284795