在Windows窗体上查找组件c#(不是控件)

我知道如何查找和收集Windows窗体中使用的所有控件的列表。 像这样的东西:

static public void FillControls(Control control, List AllControls) { String controlName = ""; controlName = control.Name; foreach (Control c in control.Controls) { controlName = c.Name; if ((control.Controls.Count > 0)) { AllControls.Add(c); FillControls(c, AllControls); } } } 

但是,此函数不会检索表单底部的非可视组件,如HelpProvider,ImageList,TableAdapters,DataSet等。

有没有办法获得这些组件的列表?

编辑:

感谢@HighCore指示我在类似的函数中使用System.ComponentModel.Component确实为我提供了一个包含ImageList,Help Provider和BindingSource等组件的列表。 但是,我仍然从这个列表中错过了TableAdapters和DataSet。 我想因为那些直接从Objectinheritance。

拜托 不要将我的旧post推荐给我,这些post显示了与我类似的function,并且只获取控件列表。

编辑:为什么负面投票? 这个问题以前从未得到过回答!

令人惊讶的是,似乎唯一的方法是通过反思。

 private IEnumerable EnumerateComponents() { return from field in GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic) where typeof (Component).IsAssignableFrom(field.FieldType) let component = (Component) field.GetValue(this) where component != null select component; }