2012-05-26 45 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