1

我有一个具有如下值的文件:

[Params]
Version=106
Monitor=0
SMode=10000000
Date=20120519

在我的程序集中,我有与这些字段相对应的属性,如下所示:

public static string Version { get; set; }
public static string Monitor { get; set; }
public static string SMode { get; set; }
public static DateTime Date { get; set; }

我正在像这样遍历文件(_params 是一个字符串列表,其中包含文件中 [Params] 部分的行):

foreach (string s in _params)
{
    string[] values = s.Split('=');

}

如何找到具有值 [0] 的变量并使用值 [1] 设置它?

编辑:

感谢 Attila,这最终成为了我的解决方案。我通过文件中的文本找到属性字段,并从文件中设置值。我还根据属性的数据类型设置了正确的类型。我必须对一些字符串进行一些转换,以使它们转换为 DateTime 数据类型:

foreach (string s in _params)
{
    string[] values = s.Split('=');

    object myObject = values[0];
    object myValue = values[1];

    if (myObject.ToString() == "Date")
        myValue = ConvertDateStringToDateTime(values[1]);
    if (myObject.ToString() == "StartTime")
        myValue = ConvertStartTimeStringToDateTime(values[1]);
    if (myObject.ToString() == "Length")
        myValue = ConvertLengthStringToTimeSpan(values[1]);

    var type = typeof(HrmParams);
    var field = type.GetProperty(myObject.ToString());

    myValue = Convert.ChangeType(myValue, field.PropertyType);

    field.SetValue(myObject, myValue, null);            
}
4

2 回答 2

2

您需要使用反射(它允许您在运行时根据对象的名称访问对象的成员,即使这些名称在编译时未知),或者在文件中已知的有效值名称和委托之间创建映射访问(例如更新)适当的变量。

第一种方法(反射)更通用,但同时更难正确使用,因为当您在文件中的值名称和访问变量之间建立连接时,编译器/代码助手无法帮助您。

第二种方法不太容易出错(编译器可以为您标记错误),但会限制您仅处理您在映射中明确指定的值名称,这意味着如果有效值名称,您必须记住更新映射在文件更改中(例如,您添加一个新变量或更改其名称)

另一种选择,在某种程度上是上述两者的混合体,是将你的变量存储在一个映射中(假设它们都具有相同的类型(例如string))——这样你就可以从文件中检查值名称反对映射。缺点是在从代码中访问变量时,编译器将无法帮助您发现拼写错误(或名称更改)

于 2012-05-26T12:26:10.273 回答
1

一个简单的 switch 语句可以工作:

foreach (string s in _params) {
  string[] values = s.Split('=');

  switch (values[0]) {
    case "Version":
      Version = values[1];
      break;
    case "Monitor":
      Monitor = values[1];
      break;
    case "SMode":
      SMode = values[1];
      break;
    case "Date":
      Date = values[1];
      break;
  }
}
于 2012-05-26T12:38:47.743 回答