Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的第一个通用铸造(C#)_C#_Generics - Fatal编程技术网

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

我的第一个通用铸造(C#),c#,generics,C#,Generics,当编译器抛出一个错误(无法将T转换为System.Web.UI.Control)时,我对编写这个通用函数感到非常兴奋 我基本上在调用它时传递一个类型,它会查找该类型的所有控件。错误发生在l.Add((T)ctrl)上 私有列表递归类型(控制CTRL) { var l=新列表(); foreach(ctrls.Controls中的var ctrl) 如果(ctrl.GetType()为T) l、 添加((T)ctrl); 返回l; } 我是错过了什么还是只是运气不好?你能告诉我们更多细节吗 pr

当编译器抛出一个错误(
无法将T转换为System.Web.UI.Control
)时,我对编写这个通用函数感到非常兴奋

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

私有列表递归类型(控制CTRL)
{
var l=新列表();
foreach(ctrls.Controls中的var ctrl)
如果(ctrl.GetType()为T)
l、 添加((T)ctrl);
返回l;
}

我是错过了什么还是只是运气不好?

你能告诉我们更多细节吗

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;
}
为什么不遵循以下代码:

private List<T> RecurseTypes<T>(Control ctrl)
    {
        List<T> l = new List<T>();
        foreach (var ctrls in ctrl.Controls)
        {
            if (ctrls is T)
                l.Add((T)ctrls);
        }
        return l;
    }
private List recurseType(控件ctrl)
{
列表l=新列表();
foreach(控件中的变量ctrls)
{
如果(ctrls为T)
l、 增加((T)个CTRL);
}
返回l;
}

设置约束将对您有所帮助

private List<T> RecurseTypes<T>(Control ctrls) where T : System.Web.UI.Control
私有列表递归类型(控件ctrls),其中T:System.Web.UI.Control

如果您使用的是.NET 3.5或更高版本,则可以使用
of type()
Cast()
扩展方法,而不是编写自己的扩展方法


OfType()
将返回可以强制转换的初始集合的子集,而
cast()
将把整个集合强制转换为所需的类型,但如果集合中的一个元素无法强制转换,将引发异常。

可能不是所需控件的类型

我的意思是,你不能确保你是从控制到t,t在哪里???从控件继承

首先需要添加一个通用约束:

private List<T> RecurseTypes<T>(Control ctrls) where T : Control

最后,您现在可以假设控件列表将存储T类型的控件。

T来自何处。让我看看类声明。@Jannis:它不是来自类,这是一个泛型方法:
RecurseTypes
。哪行抛出异常?@ssg-不,我不这么认为。听起来@maxp在特定类型的子控件之后;这并不意味着父控件必须是这样。例如,
面板中的所有
文本框
控件
T=TextBox
ctrl
是一个
面板(不是
TextBox
)。@ssg它不必是。原因是,将检查进入列表的项目的类型。参数只需要是一个控件。它不必是与t.@Ani相同的特定类型-抱歉,我读错了行-你一定是我页面上最上面的。我的错误。因为这会导致编译器错误:错误1无法将类型“Foo.Control”转换为“T”
private List<T> RecurseTypes<T>(Control ctrls) where T : System.Web.UI.Control
private List<T> RecurseTypes<T>(Control ctrls) where T : Control
 if (ctrl.GetType().IsSubclassOf(typeof(Control))