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 return
restituisce 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 return
mentre 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 return
nelle funzioni ricorsive, l'utilizzo della memoria si ridimensiona in modo esplosivo. Vedi stackoverflow.com/a/30300257/284795