2013-05-06 4 views
1

У меня есть структуру, которая выглядит следующим образом:Ссылка имя переменной динамически

public struct ChannelSettings 
{ 
    public double slider20Hz; 
    public double slider25Hz; 
    public double slider31_5Hz; 
    public double slider40Hz; 
} 

и я перекручивание через мои объекты пользовательского интерфейса, когда значение ползунка изменяется следующим образом:

foreach (Slider slider in grdEqSliders.Children) 
{ 
    // slidername = slider.Name; 
    switch(currentChannel) 
    { 
     case 1: 
      // Assign to channel.slidername 
      break; 
     case 2: 
      // Assign to channel.slidername 
      break; 
     default: 
      break; 
     } 
} 

Мой вопрос есть, есть ли способ получить имя ползунка, а затем включить его в то, что я могу ссылаться непосредственно в моей структуре? Например, я хотел бы превратить slider.Name = "slider_20Hz" в переменную slider20Hz, которую я использую в своей структуре.

+1

Ну, вы можете включить строку; просто есть случаи, когда каждая из этих четырех строк, а не 1, 2, 3, 4. Вы можете использовать отражение, но в случае, если этот простой «переключатель», вероятно, проще. – Servy

+0

Я буду иметь несколько структур, хотя и должен убедиться, что значение получает правильное значение. –

+1

Доступ к соответствующей переменной (после вашего имени) адресуется [здесь] (http://stackoverflow.com/questions/5218625/get-and-set-the-variable-value-by-passing-name) - вы можете сделать это, используя отражение. Лучшее решение (возможно), если оно работает для вашей кодовой базы, будет хранить двойники в словаре - текущее имя переменной «становится» ключом. –

ответ

5

Единственный способ сделать это, оставив struct определяется как это в настоящее время является использование отражения - довольно грязным, хотя.

Альтернатива - изменить определение - это хранить значения в словаре:

public class ChannelSettings { 
    Dictionary<string, double> _values = new Dictionary<string, double>(); 

    public double slider20Hz { 
    get { 
     return GetByName("slider20Hz"); 
    } 
    set { 
     _values["slider20Hz"] = value; 
    } 
    } 

    . . . 

    public void SetByName(string name, double value) { 
    _values[name] = value; 
    } 

    public double GetByName(string name) { 
    double v; 
    if (_values.TryGetValue("slider20Hz", out v)) { 
     return v; 
    } 
    return 0.0; // Default value 
    } 

} 

, а затем установить значение с учетом его имя, которое вы можете написать:

channel.SetByName(slider.Name, . . .) 

и получить a Значение:

channel.GetByName(slider.Name) 
+0

Я не думал об этом так, это должно работать отлично. Благодарю. –

+0

'Нет никакого способа сделать это, оставив структуру, определенную так, как она есть сейчас.' Конечно, есть; вы можете сделать именно то, что вы сделали, используя отражение, если вы действительно хотите *, хотя вы, вероятно, этого не захотели. – Servy

+0

@Servy: вы правы, я исправляю свой ответ – MiMo

1

Элемент управления слайдером, так как все элементы FrameworkElements имеют свойство Tag для таких ситуаций, когда вам нужно свойство для вашего собственного использования.

<Slider Tag="slider_20Hz"/> 

foreach (Slider slider in grdEqSliders.Children) 
{ 
    slidername = slider.Tag as string; 
    ... 
} 
+0

Да, я получаю это, но тогда нужно ссылаться на переменную в структуре с похожим именем. –

Смежные вопросы