【问题标题】:How do I name variables dynamically in C#?如何在 C# 中动态命名变量?
【发布时间】:2011-06-29 08:29:10
【问题描述】:

有没有办法动态命名变量?

我需要做的是从输入文件中获取变量名列表并使用这些名称创建变量。这可能吗?

类似:

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

假设我已经处理好了Variable 类,并且变量的名称包含在一个名为strLine 的字符串中。

【问题讨论】:

  • 您是在谈论生成要编译的代码还是在运行时动态地做某事?请告诉我们您的用例和想要这样做的原因。
  • 你为什么要这样做?这有什么关系?即使需要在某处输出变量的名称,也可以将名称存储在Variable类中。
  • 你能解释一下你为什么发布这个问题吗?也许有正确的方法来做你想做的事
  • 我想这样做的原因是我正在为一种编造的编程语言创建一个解释器,并且我需要能够存储该语言的变量。

标签: c# variables dynamic-data


【解决方案1】:

使用Dictionary&lt;string, Variable&gt;

例如

var vartable = new Dictionary<string, Variable>();
vartable[strLine] = new Variable(input);

【讨论】:

    【解决方案2】:

    C# 4.0,使用 dynamic 对象:

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

    【讨论】:

      【解决方案3】:

      不,但您可以使用Dictionary&lt;string, Variable&gt;,然后您可以通过引用的名称引用每个变量。

      【讨论】:

        【解决方案4】:

        你不能这样做,但你想做的是乞求字典的使用:

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

        【讨论】:

          【解决方案5】:

          试试这个,用户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);
                  }
               }
              }
          

          【讨论】:

            【解决方案6】:

            在编译时应该知道变量名。如果您打算在运行时动态填充这些名称,您可以使用 List&lt;T&gt;

             var variables = List<Variable>();
             variables.Add(new Variable { Name = input1 });
             variables.Add(new Variable { Name = input2 });
             ...
            

            【讨论】:

              【解决方案7】:

              没有。但是,您可以将它们加载到 Dictionary 对象中。这允许您仍然(在某种程度上)使用名称来引用它们,这比使用索引更容易,就像使用 Array 或 ArrayList 一样。

              【讨论】:

                【解决方案8】:

                我会使用某种键控集合,例如哈希表、字典或带有名称的结构列表。然后您可以按名称引用变量:

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

                没有其他方法可以动态“命名”变量。

                【讨论】:

                  【解决方案9】:

                  没有。使用数组,否则不能这样做。

                  【讨论】:

                    猜你喜欢
                    • 2021-12-15
                    • 1970-01-01
                    • 2010-10-20
                    • 1970-01-01
                    • 1970-01-01
                    • 2011-08-18
                    • 2013-03-25
                    • 1970-01-01
                    • 2011-11-02
                    相关资源
                    最近更新 更多