Использование C# для рекурсивного получения коллекции элементов управления из коллекции элементов управления

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

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 ответа

Решение

Проблема:

поскольку 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 является ссылочным типом, его ссылка будет передана.

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

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

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

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

Другие вопросы по тегам