c# -将变量编译为名称/代码

本文关键字:代码 编译 变量 | 更新日期: 2023-09-27 17:50:15

由于我不能很好地解释我的上一个问题,我没有得到一个让我满意的答案,我决定打开一个新的。
直截了当地说,我基本上要做的是编译一个变量(它持有的值)作为代码的一部分(特别是在我的情况下引用另一个变量)
假设我有:

int var_1, var_2, var_3 ... var_10;
for (int i = 1; i <= 10; i++)
{
    var_%i%=20; //if i is 1, then var_1's value will be set to 20, if i is 2, then var_2's value will be set to 20. So basically this loop sets the value of var_1 .. var_10 to 20
}

我可以用一种更简单的方式来解释,如果后者在任何情况下都不清楚的话。
int var_5;
int SomeOtherVar = 5;
var_%SomeOtherVar% = 10; // so var_5 (where 5 is the value of SomeOtherVar) is set to 10

这可行吗?如果可行,方法是什么?

c# -将变量编译为名称/代码

不行,为什么不用数组呢?

    int[]  array = new int[3];
    for (int i = 0; i < array.Length; ++i)
    {
        array[i] = 20;
    }

希望能有所帮助。

不行。使用数组代替。类型是int[],但我建议你去阅读关于数组的教程,以了解如何创建和使用它们。

我想不出有什么情况需要这样做。如果希望根据连续的数字列表存储值,请使用数组。否则你可以用字典。例如,要像问题中那样存储"var1"= 20,"var2"= 20,您可以这样做:

Dictionary<string, int> dict = new Dictionary<string, int>();
for (int i = 1; i <= 10; i++)
{
    dict.Add("var" + i.ToString(), 20);
}

用法示例:

dict["var1"]              // 20
dict["var2"]              // 20
dict.ContainsKey("var3")  // true
dict.ContainsKey("var99") // false

注意:我将字符串"var"与循环中的int连接起来只是为了演示您可以使用任意字符串作为键来存储/查找值。在这种情况下,这样做有点奇怪,您可能最好坚持使用普通数组,但我的示例展示了字典如何处理更复杂的键。

如果您想绕过静态类型检查,并且您想创建一些编码恐怖,您可以将ExpandoObject与dynamic关键字结合使用。不允许您在作用域中设置变量,但从技术上讲允许您声明自己的变量。请注意,在我的示例中,我将其强制转换为IDictionary<string, object>,因为我在运行时从字符串创建其成员的名称。下面的方法所做的是创建20个成员,并将它们的值赋给0到19。

static dynamic SetVariables(IEnumerable<int> range)
{
    const string variableName = "var_";
    var expandoDictionary = new ExpandoObject() as IDictionary<string, object>;
    foreach (var i in range)
        expandoDictionary[variableName + i] = i;
    return expandoDictionary;
}

然后可以通过以下方式轻松地访问成员:

var container = SetVariables(Enumerable.Range(0, 20));
var value13 = container.var_13;

请注意,我推荐这种用法,并且我会尽可能地远离dynamic。然而,为了解决问题,这可以被看作是一个不安全的部分解决方案。