我的文件的值如下:
[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);
}
答案 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;
}
}