Em C # (desde que você o marcou como tal), você pode usar uma expressão LINQ como esta:
List<Control> c = Controls.OfType<TextBox>().Cast<Control>().ToList();
Edite para recursão:
Neste exemplo, você primeiro cria a lista de controles e depois chama um método para preenchê-lo. Como o método é recursivo, ele não retorna a lista, apenas a atualiza.
List<Control> ControlList = new List<Control>();
private void GetAllControls(Control container)
{
foreach (Control c in container.Controls)
{
GetAllControls(c);
if (c is TextBox) ControlList.Add(c);
}
}
Pode ser possível fazer isso em uma instrução LINQ usando a Descendants
função, embora eu não esteja tão familiarizado com ela. Veja esta página para mais informações.
Edite 2 para retornar uma coleção:
Como o @ProfK sugeriu, um método que simplesmente retorna os controles desejados é provavelmente a melhor prática. Para ilustrar isso, modifiquei o código da seguinte maneira:
private IEnumerable<Control> GetAllTextBoxControls(Control container)
{
List<Control> controlList = new List<Control>();
foreach (Control c in container.Controls)
{
controlList.AddRange(GetAllTextBoxControls(c));
if (c is TextBox)
controlList.Add(c);
}
return controlList;
}