Buscar todos los controles secundarios de tipo específico utilizando Enumerable.OfType () o LINQ

MyControl1.Controls.OfType() busca solo a través de la colección inicial y no ingresa a los elementos MyControl1.Controls.OfType() .

¿Es posible encontrar todos los controles secundarios de tipo específico usando Enumerable.OfType() o LINQ sin escribir el propio método recursivo? Me gusta esto

Utilizo un método de extensión para aplanar la jerarquía de control y luego aplicar filtros, por lo que se usa el propio método recursivo.

El método se ve así

 public static IEnumerable FlattenChildren(this Control control) { var children = control.Controls.Cast(); return children.SelectMany(c => FlattenChildren(c)).Concat(children); } 

Yo uso este método genérico recursivo:

La suposición de este método es que si el control es T, entonces el método no se ve en sus elementos secundarios. Si también necesita mirar a sus hijos, puede cambiarlo fácilmente en consecuencia.

 public static IList GetAllControlsRecusrvive(Control control) where T :Control { var rtn = new List(); foreach (Control item in control.Controls) { var ctr = item as T; if (ctr!=null) { rtn.Add(ctr); } else { rtn.AddRange(GetAllControlsRecusrvive(item)); } } return rtn; } 

Para mejorar la respuesta anterior, tendría sentido cambiar el tipo de devolución a

 //Returns all controls of a certain type in all levels: public static IEnumerable AllControls( this Control theStartControl ) where TheControlType : Control { var controlsInThisLevel = theStartControl.Controls.Cast(); return controlsInThisLevel.SelectMany( AllControls ).Concat( controlsInThisLevel.OfType() ); } //(Another way) Returns all controls of a certain type in all levels, integrity derivation: public static IEnumerable AllControlsOfType( this Control theStartControl ) where TheControlType : Control { return theStartControl.AllControls().OfType(); }