动态引用变量名称

时间:2013-05-06 19:23:21

标签: c# wpf

我有一个看起来像这样的结构:

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

2 个答案:

答案 0 :(得分: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, . . . )

并获得一个值:

channel.GetByName(slider.Name)

答案 1 :(得分:1)

Slider控件,与所有FrameworkElements一样,具有Tag属性,适用于您需要属性供自己使用的这些类型的情况。

<Slider Tag="slider_20Hz"/>

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