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なる可能性があるため、コンパイラはより多くの情報を必要とします。reference typevalue type

Integerとを に変換することはできませんControl

解決:

これを修正するには、where T : Controlor where 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);

を呼び出さないため、これはタラよりも高速になりますGetType()
を継承するコントロールも追加されることに注意してくださいT

また、を追加してtypeパラメーターを制約する必要がありますwhere T : Control

于 2010-12-16T17:02:06.467 に答える