有没有办法根据另一个变量的值动态更改正在设置的变量?

Is there a way to dynamically change which variable is being set based on the value of another variable?

提问人:WhyV 提问时间:7/7/2023 最后编辑:Uwe KeimWhyV 更新时间:7/7/2023 访问量:71

问:

我希望能够通过读取文本配置文件在 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]
    }
}

我试图查找有关做这样的事情的信息,但由于我不知道事物的正确术语,因此很难找到任何东西。

C# 数组变量

评论

1赞 AoooR 7/7/2023
也许你可以使用字典,其中键是你的变量名,值是它的值。因此,您可以调用 ,而不是调用变量 。Variable1variables["Variable1"]
0赞 AoooR 7/7/2023
这回答了你的问题吗?字符串到变量名

答:

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);
    }

}