Puis-je avoir une méthode retournant IEnumerator<T>, et l'utiliser dans une boucle foreach?

J'ai besoin de régler la hauteur de chaque zone de texte sur mon formulaire, dont certains sont imbriqués dans d'autres contrôles. Je pensais que je pouvais faire quelque chose comme ceci:

private static IEnumerator<TextBox> FindTextBoxes(Control rootControl)
{
    foreach (Control control in rootControl.Controls)
    {
        if (control.Controls.Count > 0)
        {
            //Recursively search for any TextBoxes within each child control
            foreach (TextBox textBox in FindTextBoxes(control))
            {
                yield return textBox;
            }
        }

        TextBox textBox2 = control as TextBox;
        if (textBox2 != null)
        {
            yield return textBox2;
        }
    }
}

De l'utiliser comme ceci:

foreach(TextBox textBox in FindTextBoxes(this))
{
    textBox.Height = height;
}

Mais bien sûr, le compilateur crache ses factice, parce que foreach s'attend à une IEnumerable plutôt qu'un IEnumerator.

Est-il un moyen de le faire sans avoir à créer une classe séparée avec un GetEnumerator() méthode?

En fait, foreach ne vous attendez pas à un IEnumerable à tous (ni un IEnumerable<T>). Il ne s'attend à quelque chose qui a une GetEnumerator méthode. Cette méthode, à leur tour, ne doivent pas nécessairement retourner un IEnumerator ou IEnumerator<T> — il seulement besoin de retourner quelque chose qui a une MoveNext() méthode et un Current de la propriété.

OriginalL'auteur littlecharva | 2008-08-06