我想从任何ControlCollection中获取所有相应类型的控件。重要的是要知道,我将一些元数据存储在控件的 Tag 属性中。 这是我获取相应T类控件的方法:
public static void GetAllChildControls<T>(Control.ControlCollection root, List<T> list) where T : Control {
if (list == null)
list = new List<T>();
foreach (Control ctl in root) {
if (ctl.GetType() == typeof(T))
list.Add((T)ctl);
if (ctl.Controls.Count > 0)
GetAllChildControls(ctl.Controls, list);
}
}
我写这篇文章的唯一原因是因为我没有收回 Tag 的值。在VS2008中,(T)ctl 没有可评估的Tag(以及ContextMenu)。它显示“无法评估表达式”。否则所有其他事情似乎都没问题。
更新
我要求Tag属性的代码:
...
List<Button> list = null;
Helper.GetAllChildControls<Button>(master.ChildControls, list);
if (list != null)
foreach (CounterItem c in counters) {
Button b = list.Single(e => e.Tag.Equals(c.Name));
^^^
if (b == null)
continue;
b.SetCounter(c.Value);
}
...
答案 0 :(得分:1)
调用方法的方式永远不会产生任何结果:
List<Button> list = null;
Helper.GetAllChildControls<Button>(master.ChildControls, list);
....
public static void GetAllChildControls<T>(Control.ControlCollection root, List<T> list) where T : Control
{
if (list == null)
list = new List<T>();
由于您未将参数作为ref List<T> list
传递,因此将创建方法范围内的list
,但list
的范围为来电者仍为null
。
如果我是你,我会让GetAllChildControls<T>
返回一个列表:
public static List<T> GetAllChildControls<T>(Control.ControlCollection root) where ...