无法将类型'System.Windows.Forms.Control'转换为'T'

时间:2010-07-15 11:40:41

标签: c#

我正在尝试创建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!");
}

6 个答案:

答案 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返回。