2

目前我正在尝试从递归控件集合(中继器)中提取一组动态创建的控件(复选框和下拉列表)。这是我正在使用的代码。

private void GetControlList<T>(ControlCollection controlCollection, ref List<T> resultCollection)
{
    foreach (Control control in controlCollection)
    {
        if (control.GetType() == typeof(T))
            resultCollection.Add((T)control);

        if (control.HasControls())
            GetControlList(controlCollection, ref resultCollection);
    }
}

我遇到以下行的问题:

resultCollection.Add((T)control);

我得到错误...

Cannot convert type 'System.Web.UI.Control' to 'T'

有任何想法吗?

4

2 回答 2

5

问题:

由于T可以是 areference type或 a value type,编译器需要更多信息。

您不能转换IntegerControl.

解决方案:

要解决此问题,请添加where T : Controlwhere T : class(更一般的)约束以声明T始终是引用类型。

例子:

private void GetControlList<T>(ControlCollection controlCollection, ref List<T> resultCollection)
where T : Control
{
    foreach (Control control in controlCollection)
    {
        //if (control.GetType() == typeof(T))
        if (control is T) // This is cleaner
            resultCollection.Add((T)control);

        if (control.HasControls())
            GetControlList(control.Controls, ref resultCollection);
    }
}
  • 您也不需要ref关键字。由于 List 是一个引用类型,它的引用将被传递。
于 2010-12-16T16:59:06.400 回答
3

将其更改为

var c = control as T;
if (c != null)
    resultCollection.Add(c);

这会比你的 cod 快,因为它不调用GetType().
请注意,它还将添加继承的控件T

您还需要通过添加来约束类型参数where T : Control

于 2010-12-16T17:02:06.467 回答