根据文本文件中的字段访问变量,根据文本文件中的字段将值写入变量

时间:2012-05-26 12:04:36

标签: c#

我的文件的值如下:

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

2 个答案:

答案 0 :(得分:2)

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

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

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

另一个替代方案,在上面两个方面有点混合,是将变量存储在映射中(假设它们都具有相同的类型(例如string)) - 这样你就可以只需根据映射检查文件中的值名称。缺点是当从代码中访问变量时,编译器将无法帮助您发现拼写错误(或名称更改)

答案 1 :(得分: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;
  }
}