Использование 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
,