提问人:WhyV 提问时间:7/7/2023 最后编辑:Uwe KeimWhyV 更新时间:7/7/2023 访问量:71
有没有办法根据另一个变量的值动态更改正在设置的变量?
Is there a way to dynamically change which variable is being set based on the value of another variable?
问:
我希望能够通过读取文本配置文件在 C# 中设置一些变量。我创建了一个函数“ReadConfigFile()”,用于读取文件并返回一个字符串数组。
ReadConfigFile() 的输出示例:
[Variable1=1234, Variable2=true, Variable3=MyCatIsGray]
目前,我使用数组设置变量的方式是使用一堆 if 语句,如下面的代码所示。但显然,如果我为我的变量使用专有名称,这将变得非常乏味,如果我想拥有更多的变量,我会变得非常乏味。
public int Variable1 = 0;
public bool Variable2 = false;
public string Variable3 = "";
public void Configure()
{
string[] config = ReadConfigFile();
foreach (string line in config)
{
string[] variableAndValueArray = line.Split("=");
if (variableAndValueArray[0] == "Variable1") { Variable1 = VariableAndValueArray[1]; }
if (variableAndValueArray[0] == "Variable2") { Variable2 = VariableAndValueArray[1]; }
if (variableAndValueArray[0] == "Variable3") { Variable3 = VariableAndValueArray[1]; }
}
}
所以我想知道是否有更好的方法。我希望这样的事情是可能的:
public int Variable1 = 0;
public bool Variable2 = false;
public string Variable3 = "";
public void Configure()
{
string[] config = ReadConfigFile();
foreach (string line in config)
{
string[] variableAndValueArray = line.Split("=");
variableAndValueArray[0] = variableAndValueArray[1]
//I want the line above to change which variable it is setting based
//on the value of variableAndValueArray[0]
}
}
我试图查找有关做这样的事情的信息,但由于我不知道事物的正确术语,因此很难找到任何东西。
答:
1赞
Dmitry Bychenko
7/7/2023
#1
我建议使用字典,顺其自然,例如Dictionary<string, object>
// Convert (Parse) text from config file into proper value
private static object TextToObject(string text) {
if (int.TryParse(text, out int intValue))
return intValue;
if (text.Trim() == "true" || text.Trim() == "false")
return text.Trim() == "true";
return text;
}
...
// Read config an turn it into a dictionary
// Simplest: no duplicate keys check
Dictionary<string, object> VariableAndValue = config
.Select(line => line.Split('='))
.Where(pair => pair.Length == 2)
.ToDictionary(pair => pair[0].Trim(), pair => TextToObject(pair[1]));
然后,您可以按如下方式查询VariableAndValue
// If VariableAndValue has Variable1 of type int then...
if (VariableAndValue.TryGetValue("Variable1", out var o) && o is int Variable1) {
//TODO: Put relevant code here
}
0赞
Sekhar
7/7/2023
#2
@WhyV - 你必须使用反射。查看以下代码
internal class Program
{
static void Main(string[] args)
{
SO temp = new SO();
temp.Configure();
}
}
class SO
{
public int Variable1 = 0;
public bool Variable2 = false;
public string Variable3 = "";
public void Configure()
{
string[] config = new string[] { "Variable1 = 1234", "Variable2 = true", "Variable3 = MyCatIsGray" };
foreach (string line in config)
{
var variableNamePart = line.Split('=')[0];
var variableValuePart = line.Split('=')[1];
variableNamePart = variableNamePart.Trim();
variableValuePart = variableValuePart.Trim();
FieldInfo fld = typeof(SO).GetField(variableNamePart);
if (fld.FieldType == typeof(System.Int32))
{
fld.SetValue(this, int.Parse(variableValuePart));
}
if (fld.FieldType == typeof(System.Boolean))
{
fld.SetValue(this, Boolean.Parse(variableValuePart));
}
if (fld.FieldType == typeof(System.String))
{
fld.SetValue(this, variableValuePart);
}
}
Console.WriteLine("Variable1 is " + Variable1);
Console.WriteLine("Variable2 is " + Variable2);
Console.WriteLine("Variable3 is " + Variable3);
}
}
评论
Variable1
variables["Variable1"]