Использование C # для рекурсивного получения коллекции элементов управления из коллекции элементов управления - PullRequest
2 голосов
/ 16 декабря 2010

В настоящее время я пытаюсь извлечь коллекцию динамически созданных элементов управления (флажки и раскрывающиеся списки) из рекурсивной коллекции элементов управления (повторитель).Это код, который я использую.

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'

Есть идеи?

Ответы [ 2 ]

6 голосов
/ 16 декабря 2010

Проблема:

Поскольку T может быть reference type или value type, компилятору требуется больше информации.

Нельзя конвертировать и Integer в Control.

Решение:

Чтобы исправить это, добавьте where T : Control или 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 является ссылочным типом, его ссылка будет передана.
3 голосов
/ 16 декабря 2010

Измените его на

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

Это будет быстрее, чем ваша треска, так как он не вызывает GetType().
Обратите внимание, что он также добавит элементы управления, которые наследуют T.

Вам также нужно ограничить параметр типа, добавив where T : Control.

...