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