web-dev-qa-db-ja.com

C#で変数に動的に名前を付けるにはどうすればよいですか?

変数に動的に名前を付ける方法はありますか?

私がする必要があるのは、入力ファイルから変数名のリストを取得し、それらの名前で変数を作成することです。これは可能ですか?

何かのようなもの:

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

すでにVariableクラスが処理されており、変数の名前がstrLineという文字列に含まれていると仮定します。

9
Brandon

使う Dictionary<string, Variable>

例えば.

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

C#4.0、dynamicオブジェクトの使用:

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

いいえ。ただし、Dictionary<string, Variable>を使用すると、引用符で囲まれた名前で各変数を参照できます。

1

それはできませんが、あなたが探しているのは辞書の使用を懇願することです。

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

これを試してください、ユーザー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);
        }
     }
    }
1
Mo Ein

ハッシュテーブル、辞書、名前の付いた構造体のリストなど、ある種のキー付きコレクションを使用します。次に、変数を名前で参照できます。

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

変数に動的に「名前を付ける」方法は他にありません。

0
KeithS

変数名はコンパイル時に認識されている必要があります。実行時にこれらの名前を動的に入力する場合は、 List<T>

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

いいえ。ただし、それらを Dictionary オブジェクトにロードすることはできます。これにより、名前を使用して(ある程度)それらを参照できます。これは、ArrayまたはArrayListの場合のように、Indexを使用するよりも少し簡単です。

0
David