0

我有一个返回List<T>子控件的方法,如下所示:

void GetAllControlsOfType<T>(List<T> lst, Control parent) where T:class
{
    if (parent.GetType() == typeof(T))
        lst.Add(parent as T);

    foreach (Control ch in parent.Controls)
        this.GetAllControlsOfType<T>(lst, ch);
}

但我必须像这样使用它:

List<WebControl> foo = new List<WebControl>();
GetAllControlsOfType<WebControl>(foo, this); //this = webpage instance

当然,有一些 c# 魔法可以让我编写一个可以这样调用的方法:

List<WebControl> foo = GetAllControlsOfType<WebControl>(this);
4

1 回答 1

2

“魔术”只是声明另一种返回List<T>而不是的方法void

List<T> GetAllControlsOfType<T>(Control parent) where T : class {
    List<T> list = new List<T>();
    GetAllControlsoFType<T>(list, parent);   // Invoke your existing method
    return list;
}

因为您使用的是递归,所以不能简单地将现有方法修改List<T>为 return ,因为这样做会使您无法跟踪该列表并在其上构建。

其他几个小点:

  • 你有:

    if (parent.GetType() == typeof(T))
    

    但写成这样会更清楚:

    if (parent is T)
    

    当然,除非你真的希望你的方法T.

  • 您可能需要考虑将新方法声明为扩展方法,方法是parent声明为this Control parent(假设它是在静态类中声明的)

    这将允许您调用该方法this.GetAllControlsOfType<WebControl>()

于 2012-08-23T01:09:15.470 回答