Ho un IEnumerable<T>metodo che sto usando per trovare i controlli in una pagina WebForms.
Il metodo è ricorsivo e sto riscontrando dei problemi nel restituire il tipo desiderato quando yield returnrestituisce il valore della chiamata ricorsiva.
Il mio codice ha il seguente aspetto:
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>();
}
}
}
Questo attualmente genera un errore "Impossibile convertire il tipo di espressione". Se tuttavia questo metodo restituisce il tipo IEnumerable<Object>, il codice viene generato, ma nell'output viene restituito il tipo errato.
C'è un modo di usare yield returnmentre si utilizza anche la ricorsione?
if(c.Controls.Count > 0)-> if(c.Controls.Any()), specialmente se anche tu stai cedendo :)
yield. Vedi di seguito :) Ed è anche un one-liner :)
yield returnnelle funzioni ricorsive, l'utilizzo della memoria si ridimensiona in modo esplosivo. Vedi stackoverflow.com/a/30300257/284795