我的第一个通用铸造(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))