Имя переменной с использованием строки .NET

Я работаю над классом десериализации в .NET, мне нужно разработать метод, который предоставляет мне имя переменной, которое хранится в строке.

У меня есть строка, например:

string string_name = "this_is_going_to_be_var_name";

Теперь, что я могу сделать, чтобы мой код динамически объявлял переменную с именем this_is_going_to_be_var_name?

Итак, чтобы прояснить ситуацию: будет класс десериализации, который будет объявлять переменные с теми же именами, что и строки, предоставленные в качестве входных данных, с их ПАРЕНТНЫМИ ТИПАМИ согласно пожеланию программиста/пользователя более высокого уровня.

Например: в javascript/jQuery, когда я получаю JSON, делая запрос, интерпретатор объявляет переменные (ы)/массив с тем же именем и присваивает им значения. Если { "var_name": "var_value" } является строкой JSON, интерпретатор создаст переменную с именем var_name и присвоит ей значение "var_value", например json_data_object.var_name.

Ответ 1

Нет, вы не можете. Все переменные С# объявлены статически.

Лучшее, что вы можете сделать, это создать словарь и использовать ключи вместо имен переменных.

// Replace object with your own type
Dictionary<string, object> myDictionary = new Dictionary<string, object>();
myDictionary.Add("this_is_going_to_be_var_name", value_of_the_variable);
// ...
// This is equivalent to foo($this_is_going_to_be_var_name) in PHP
foo(myDictionary["this_is_going_to_be_var_name"]); 

Ответ 2

Это невозможно, имена переменных определяются во время компиляции, а не время выполнения. Один из подходов состоит в том, чтобы создать словарь или хеш-таблицу для сопоставления имен строк для объектов, чтобы добиться того, чего вы хотите.

Ответ 3

Не уверен, что вы имели в виду

мой код динамически объявляет переменную с именемthis_is_going_to_be_var_name?

но .Net-версия того, что explode делает в PHP, Split:

string[] zz = "this_is_going_to_be_var_name".Split('_');

Ответ 4

Единственное, что я могу думать в данный момент (я не проверял его, поэтому я не знаю, возможно ли это), должен иметь объект типа dynamic, а затем попытаться установить поля во время выполнения с помощью отражения и InvokeMember(), что я могу дать шанс, что он будет работать с тех пор, пока не будет проверки на объекты типа dynamic.

UPDATE: Я тестировал его с помощью ExpendoObject и InvokeMember, похоже, не работает (по крайней мере, не со связующим по умолчанию, но я не тестировал его с помощью DynamicObject и, хотя я не даю ему больших шансов на работу, вы все равно можете попробовать, вы можете проверить http://msdn.microsoft.com/en-us/library/ee461504.aspx о том, как использовать DynamicObject.

Взгляните на Динамическое добавление свойств в ExpandoObject, который по существу описывает метод, в котором динамический объект создается как IDictionary, и затем вы можете добавлять свойства к это, используя стандартный доступ к словарю, в то время как они фактически получают свойства объекта.

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

dynamic test = new ExpandoObject(); 
//reference the object as a dictionary
var asDictinary = test as IDictionary<string, Object>;

//Test by setting it as property and get as a dictionary
test.testObject = 123;
Console.Write("Testing it by getting the value as if it was a dictionary");
Console.WriteLine(asDictinary["testObject"]);

//Test by setting as dictionary and get as a property
//NOTE: the command line input should be "input", or it will fail with an error
Console.Write("Enter the varible name, ");
Console.Write("note that for the example to work it should the word 'input':");
string variableName = Console.ReadLine();
Console.Write("Enter the varible value, it should be an integer: ");           
int variableValue = int.Parse(Console.ReadLine());
asDictinary.Add(variableName, variableValue);
Console.WriteLine(test.input);//Provided that the command line input was "input"

(Тем не менее, в вашем случае, так как вы в любом случае не получите доступ к свойствам непосредственно в коде, я не вижу необходимости в нем, и вы, вероятно, сможете напрямую использовать словарь, и я не понимаю, зачем вам нужно они должны быть свойствами объекта, которые необходимы только в том случае, если вы хотите ссылаться на них во время компиляции.

Но, возможно, я не понимаю вас, и вы ищете динамическую переменную, а не динамическое свойство [что-то, что доступно на PHP с использованием синтаксиса $$], если это так, то обратите внимание, что в С# нет переменные вообще, поскольку все инкапсулировано в объект).

Вы также можете заглянуть в Как добавить динамическое добавление поля в класс в С# для получения дополнительных ответов.