我正在尝试创建Generic FindControl方法,并且出现以下错误:
无法将类型'System.Windows.Forms.Control'转换为'T'
代码:
public T Control<T>(String id)
{
foreach (Control ctrl in MainForm.Controls.Find(id, true))
{
return (T)ctrl; // Form Controls have unique names, so no more iterations needed
}
throw new Exception("Control not found!");
}
答案 0 :(得分:8)
试试这个
public T Control<T>(String id) where T : Control
{
foreach (Control ctrl in MainForm.Controls.Find(id, true))
{
return (T)ctrl; // Form Controls have unique names, so no more iterations needed
}
throw new Exception("Control not found!");
}
答案 1 :(得分:3)
你总是可以弯曲规则并进行双重演员。例如:
public T Control<T>(String id)
{
foreach (Control ctrl in MainForm.Controls.Find(id, true))
{
return (T)(object)ctrl;
}
throw new Exception("Control not found!");
}
答案 2 :(得分:1)
由于T不受约束,您可以为type参数传递任何内容。您应该在方法签名中添加“where”约束:
public T Control<T>(string id) where T : Control
{
...
}
答案 3 :(得分:0)
你怎么称呼这个方法,你有一个例子吗?
另外,我会为你的方法添加一个约束:
public T Control<T>(string id) where T : System.Windows.Forms.Control
{
//
}
答案 4 :(得分:0)
虽然其他人已经正确地指出了问题所在,但我只是想说明这非常适合扩展方法。不要赞成这个,这实际上是一个评论,我只是将它作为答案发布,这样我就可以更好地编写代码并更好地格式化我的代码;)
public static class Extensions
{
public static T FindControl<T>(this Control parent, string id) where T : Control
{
return item.FindControl(id) as T;
}
}
这样你可以像这样调用它:
Label myLabel = MainForm.Controls.FindControl<Label>("myLabelID");
答案 5 :(得分:-1)
将您的方法签名更改为:
public T Control<T>(String id) where T : Control
说明所有T实际上都是Control
类型。这将约束T并且编译器知道您可以将其作为T返回。