Задача на размышление (приведение типов или, может, другое решение) - C#
Формулировка задачи:
Есть класс MasterPanel, одним из элементов которого является панель Panel. Элементы MasterPanel хранятся в словаре Dictionary<string, MasterPanel>.
Доступ к панели через MasterPanel.Panel. Панели содержат на себе различные контролы Control (от конкретного типа контрола код зависеть не должен). Прямого доступа к элементам на панели нет. Только доступ к самой панели.
Требуется с этих нескольких панелей считать значения в элементах и записать их в одну коллекцию, xml-файл или что-то другое, что потом позволит восстановить значения.
Я мало до чего додумался.
Есть идея записать все значения из panel.Controls (для каждой панели) в коллекцию List<var>.
Тут возникает несколько проблем:
1. Не во всех контролах значение записывается в свойство text. А value Или selectedItem из Control не достать, требуется приведение.
2. Если какой-либо контрол, например, Label взять из panel.Controls (без приведения он будет иметь тип Control), и поместить его самого в var, то какой тип получит эта переменная var, и что делать дальше.
Помогите, пожалуйста с решением проблемы.
Прилагаю описание класса MasterPanel:
/// <remark> /// Класс панели мастера /// </remark> public class MasterPanel { private string nextPanel = null; private Panel panel; private bool canContinue = false; #region СВОЙСТВА /// <summary> /// Возвращает элемент Control представляющий панель для ее указания как родителя /// </summary> public Control Panel { get { return panel; } } /// <summary> /// Задает родительский контейнер для панели /// </summary> public Control parent { set {panel.Parent = value; } } /// <summary> /// Задает положение панели в родительском контейнере /// </summary> public Point Location { set {panel.Location = value; } } /// <summary> /// Возвращает или задает ключ для получения следующей панели настройки /// </summary> public string NextPanel { get { return nextPanel; } set { nextPanel = value; } } #endregion public MasterPanel() { this.panel = new Panel(); panel.Size = new System.Drawing.Size(400,340); panel.AutoScroll = true; panel.AutoSize = false; } /// <summary> /// Отображает панель в родительском контейнере /// </summary> public void Show() { if(panel.Parent != null) panel.Show(); else throw new Exception("Не указан родительский контейнер!"); } public void Hide() { panel.Hide(); } }
Решение задачи: «Задача на размышление (приведение типов или, может, другое решение)»
textual
Листинг программы
string[] propNames = {"Value", "Checked"}; var props = control.GetType().GetProperties(bf); var prop; try {prop = props.First(x => propNames.Contains(x.Name));} catch {prop = props.First(x => x.Name == "Text");}
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д