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
这可行吗?如果可行,方法是什么?
不行,为什么不用数组呢?
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
。然而,为了解决问题,这可以被看作是一个不安全的部分解决方案。