2013-05-06 129 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。您可以使用反射,但在這種情況下,'switch'可能更簡單。 – Servy 2013-05-06 19:26:40

+0

雖然我會有多個結構,並且需要確保將值放入正確的值。 – 2013-05-06 19:28:07

+1

訪問適當的變量(一旦你有它的名字)解決[此問題在這裏](http://stackoverflow.com/questions/5218625/get-and-set-the-variable-value-by-passing-name ) - 你可以使用反射。一個(可能)更好的解決方案,如果它適用於你的代碼庫,將會把雙精度字節存儲在一個字典中 - 當前的var「name」成爲關鍵字。 – 2013-05-06 19:33:35

回答

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) 
+0

我沒有想過這樣做,這應該完美。謝謝。 – 2013-05-06 19:38:08

+0

'沒有辦法做那離開現在定義的結構.'當然有;如果你真的想*,你可以使用反射來完成你完成的工作,儘管你可能不想。 – Servy 2013-05-06 20:08:07

+0

@Servy:你說得對,我正在修復我的回答 – MiMo 2013-05-06 20:23:24

1

與所有FrameworkElements一樣,Slider控件對於這些類型的情況(其中您需要屬性供您自己使用)具有Tag屬性。

<Slider Tag="slider_20Hz"/> 

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

是的,我明白了,但是需要使用相似的名稱來引用結構體中的變量。 – 2013-05-06 19:30:36