2013-04-23 101 views
2

我想從名稱中獲取變量的值。使用字符串的名稱獲取變量的值

爲了澄清,一個XML文檔將變量名作爲字符串傳遞;我想獲得價值。

事情是這樣的:

string bublegumA = "strawberry"; 
string bubblegumB = "banana"; 

//get which variable from the XML 

string fromXML = "bubblegumB"; 

string output = getValue(fromXML); 

//it should return "banana" 
+1

*「使用C#.NET 2.0我希望得到一個變量的值,從它的名字「* - 不,你不需要,你想要一個真正的解決方案來解決這個問題,你現在還無法想象它。 – 2013-04-23 23:59:54

回答

2

基本上,這是反思的應用:

這應該工作,如果它是一個領域:

var value = targetObject.GetType().GetField(fromXml).GetValue(targetObject, null); 

所以,如果你的類是:

public class MyClass 
{ 
    public string BubblegumA = "Strawberry"; 
} 

然後在主類:

public static void Main() 
{ 
    MyClass targetObject = new MyClass(); 

    var value = targetObject.GetType().GetField("BubblegumA").GetValue(targetObject, null); 

    //value should = Strawberry 
} 
+2

我建議不要建議初學者在查找表執行時使用反射。 – 2013-04-24 00:03:41

+0

我同意,如果這是一個我試圖解決的問題,那不是我要這樣做的方式 - 但它是對問題的有效答案 - 只是不是最佳實踐。 – 2013-04-24 00:08:33

+2

這回答了這個問題 – 2013-04-24 00:12:30

4

你不能做到這一點。變量名稱僅在設計時存在。一旦編譯完成(沒有調試符號),變量名就會丟失。

但你可以這樣做:

var myValues = new Dictionary<string, string>(); 
myValues["bublegumA"] = "strawberry"; 
myValues["bublegumB"] = "banana"; 

string output = myValues["bublegumB"]; // "banana" 

你也可以使用一個ExpandoObject,如果你不喜歡設置屬性的字典語法,但你還是將其轉換爲一個字典來獲得由價值名稱:

dynamic myValues = new ExpandoObject(); 
myValues.bublegumA = "strawberry"; 
myValues.bublegumB = "banana"; 

string output1 = myValues.bublegumB; // "banana" 
string output2 = (string)((IDictionary<string, object>)myValues)["bublegumB"]; // "banana" 
+0

我知道你可以使用Reflection來做到這一點。 – WayneScroggins 2013-04-24 15:10:13

+0

@WayneScroggins使用變量,你不能。反射允許您檢查類型的結構,包括屬性和字段(如* RussC *的答案),但在方法中定義的變量的名稱在運行時不存在。 – 2013-04-24 15:38:48

+0

@WayneScroggins另請注意,反射比使用集合要慢得多。如果你只是用這種方式來存儲名稱 - 值對,那真的不是一個好的解決方案。 – 2013-04-24 15:49:24