2013-04-23 1 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 Я хочу, чтобы получить значение переменной от его имени . * * - Нет, нет, вы хотите найти реальное решение этой проблемы, вы просто не можете этого себе представить. –

ответ

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

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

+0

Согласен, если это была проблема, которую я пытался решить, это не так, как я бы это сделал - но это правильный ответ на проблему - просто не лучшая практика. –

+2

это отвечает на вопрос –

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

+0

@WayneScroggins С переменными вы не можете. Отражение позволяет вам проверять структуру типов, включая свойства и поля (например, ответ * RussC *), но имена переменных, определенных в методе, не существуют во время выполнения. –

+0

@WayneScroggins Также обратите внимание, что отражение намного медленнее, чем использование коллекции. Если вы просто используете это как способ для хранения пар имя-значение, это действительно нехорошее решение. –