Задача на размышление (приведение типов или, может, другое решение) - 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");}
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д