Как мне динамически называть переменные в С#?

Есть ли способ динамически называть переменные?

Что мне нужно сделать, так это взять список имен переменных из входного файла и создать переменные с этими именами. Это возможно?

Что-то типа:

Variable <dynamic name of variable here> = new Variable(input);

Предположим, что я уже позаботился о классе Variable, а имя переменной содержится в строке с именем strLine.


person Brandon    schedule 17.02.2011    source источник
comment
Вы говорите о создании кода для компиляции или о выполнении чего-то динамического во время выполнения? Пожалуйста, расскажите нам о вашем случае использования и причинах, по которым вы хотите это сделать.   -  person Andreas Vendel    schedule 17.02.2011
comment
Зачем тебе вообще это делать? Как это вообще имеет значение? Даже если вам нужно где-то вывести имя переменной, вы можете сохранить это имя в классе Variable.   -  person Yogesh    schedule 17.02.2011
comment
Можете ли вы объяснить, почему вы разместили этот вопрос? есть, может быть, правильные способы делать то, что вы хотите   -  person Steve B    schedule 17.02.2011
comment
Причина, по которой я хочу это сделать, заключается в том, что я создаю интерпретатор для выдуманного языка программирования, и мне нужно иметь возможность хранить переменные для указанного языка.   -  person Brandon    schedule 17.02.2011


Ответы (9)


Используйте Dictionary<string, Variable>.

e.g.

var vartable = new Dictionary<string, Variable>();
vartable[strLine] = new Variable(input);
person Ben Voigt    schedule 17.02.2011

С# 4.0, используя объекты dynamic:

dynamic d = new ExpandoObject();
((IDictionary<string, object>)d)["MyProperty"] =  5;
int val = d.MyProperty; // 5
person xanatos    schedule 17.02.2011

Нет, но вы можете использовать Dictionary<string, Variable>, и тогда вы сможете ссылаться на каждую переменную по ее имени в кавычках.

person Blorgbeard    schedule 17.02.2011

Вы не можете этого сделать, но то, что вы хотите сделать, это попросить использовать словарь:

Dictionary<object, object> d = new Dictionary<string, object>();
d.Add("Variable1", value1);
d.Add("Variable2", value2);
d.Add("Variable3", value3);
person Kon    schedule 17.02.2011

попробуйте этот, пользователь json для сериализации и десериализации:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web.Script.Serialization;

    namespace ConsoleApplication1
    {
     public class Program
     {
        static void Main(string[] args)
        {
            object newobj = new object();

            for (int i = 0; i < 10; i++)
            {
              List<int> temp = new List<int>();

              temp.Add(i);
              temp.Add(i + 1);

               newobj = newobj.AddNewField("item_" + i.ToString(), temp.ToArray());
            }

       }

    }

    public static class DynamicExtention
    {
        public static object AddNewField(this object obj, string key, object value)
        {
            JavaScriptSerializer js = new JavaScriptSerializer();

            string data = js.Serialize(obj);

            string newPrametr = "\"" + key + "\":" + js.Serialize(value);

            if (data.Length == 2)
           {
               data = data.Insert(1, newPrametr);
            }
          else
            {
                data = data.Insert(data.Length-1, ","+newPrametr);
            }

            return js.DeserializeObject(data);
        }
     }
    }
person Mo Ein    schedule 10.01.2016

Имена переменных должны быть известны во время компиляции. Если вы намерены динамически заполнять эти имена во время выполнения, вы можете использовать List<T>. .

 var variables = List<Variable>();
 variables.Add(new Variable { Name = input1 });
 variables.Add(new Variable { Name = input2 });
 ...
person Darin Dimitrov    schedule 17.02.2011

Однако вы можете загрузить их в объект Dictionary. Это позволяет вам по-прежнему ссылаться на них (в некоторой степени) с использованием имени, что немного проще, чем использование индекса, как с массивом или ArrayList.

person David    schedule 17.02.2011

Я бы использовал какую-то коллекцию с ключами, например хэш-таблицу, словарь или список структур с именем. Затем вы можете обратиться к переменной по имени:

var value = variableDictionary["MyVariableName"];
var value = variableHashtable["MyVariableName"];
var value = variableList.First(x=>x.Name == "MyVariableName");

Другого способа динамически «именовать» переменную нет.

person KeithS    schedule 17.02.2011

Нет. Используйте массив, иначе вы не сможете этого сделать.

person The GiG    schedule 17.02.2011