Задача на размышление (приведение типов или, может, другое решение) - 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");}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.786 из 5
Похожие ответы