我的第一个通用铸件(C#)

max*_*axp 5 c# generics

当编译器抛出错误时,我很兴奋写这个泛型函数(unable to cast T to System.Web.UI.Control)

当我调用它时,我基本上将它传递给它,它会查找该类型的所有控件.发生错误l.Add((T)ctrl);

    private List<T> RecurseTypes<T>(Control ctrls)
    {
        var l = new List<T>();
        foreach (var ctrl in ctrls.Controls)
            if (ctrl.GetType() is T)
                l.Add((T)ctrl);
        return l;
    }
Run Code Online (Sandbox Code Playgroud)

我错过了什么,或者我只是运气不好?

Mar*_*ell 13

private List<T> RecurseTypes<T>(Control parent) where T: Control
{
    var l = new List<T>();
    foreach (var child in parent.Controls)
        if (child is T)
            l.Add((T)child);
    return l;
}
Run Code Online (Sandbox Code Playgroud)

2个变化:

  • 添加where T : Control通用约束
  • 看看is用法(控件可以是a T,但是GetType()返回Type,这绝不是一个Control)

另外,请注意,这并没有真正递归; 这可能只是:

return ctrl.Controls.OfType<T>().ToList();
Run Code Online (Sandbox Code Playgroud)