2012-05-26 41 views
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]?

编辑:

感谢阿提拉,这结束了我的解决方案。我通过文件中的文本找到属性字段,并从文件中设置值。我也根据属性的数据类型设置正确的类型。我必须做一些字符串的一些转换,使它们转换为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

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

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

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

另一种替代方法是上述两种方法的混合,它将变量存储在映射中(假设所有他们有相同的类型(例如string)) - 这样你就可以根据映射检查文件中的值名称。缺点是,编译器将不能够帮助您发现错别字(或名称变更)从代码

+0

谢谢,我会研究它... – jmelhus

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; 
    } 
} 
+0

谢谢!这是真的,但该文件比我在这里写的文件要大,而且我的属性比我在这里写的要多得多,所以它更容易通过反射以编程方式访问它们。 – jmelhus