2015-09-21 64 views
1

我正在爲一些變量提供一些保存和打開功能的小程序。 變量是不同類型的,詮釋的 - 字符串 - 雙也陣列使用通用數組讀取文件參考

我想實現一個功能,可以應付所有不同的數據類型

比方說,我有以下變量

int var_int_1 = 1; 
double var_double_1 = 2.2; 
string var_string_1 = "three"; 
int[] arr_int_1 = new int[5]; 

保存的文件看起來像這樣

var_int_1: 1 
var_double_1: 2.2 
var_string_1: "three" 
arr_int_1: 
    arr_int_1_00: 1; 
    arr_int_1_01: 2; 

我開的功能將類似於

public bool open(string filename) 
{ 
    try 
    { 
     string line; 
     using (StreamReader file = new StreamReader(filename)) 
     { 
      while ((line = file.ReadLine()) != null) 
      { 
       extract_value_from_stream("var_int_1", line, ref var_int_1); 
       extract_value_from_stream("var_double_1", line, ref var_double_1); 
       extract_value_from_stream("var_string_1", line, ref var_string_1); 
       extract_value_from_stream("arr_int_1", line, ref arr_int_1); 
      } 
     } 
    } 
    catch ...  

的extract_value_from_stream功能:

public void extract_array_from_stream<T>(string str_name, string line, ref T var_name) 
    { 
      if (typeof(T).IsArray) //T is an array => return array element 
      { 
       string index; 
       str_name += "_";  //add "_" to name 

       index = line.Substring(line.IndexOf(str_name) + str_name.Length,2);  //read index - 2 positions after str_name 

       var_name[int.Parse(index)] = (T)Convert.ChangeType(line, typeof(T)); 
      } 
      else //if no array => return single value 
      { 
       str_name += ": ";     //add ":" to name (see file) 
       if (line.Contains(str_name))  //if line contains name 
       { 
        line = line.Substring(line.IndexOf(str_name) + str_name.Length); //data = substring after str_name 
        var_name = (T)Convert.ChangeType(line, typeof(T));     //cast line to correct type var_name 
       }   
      } 
     } 

無陣列部分很好地工作。在陣列部分產生這個錯誤:

Cannot apply indexing with [] to an expression of type T

有沒有什麼辦法解決這個問題?

+0

你不能簡單地創建一個類,將有屬性的所有變量和只使用它序列化到JSON [的Json .NET](http://www.newtonsoft.com/json)? –

回答

0

save and open functionality for a bunch of variables

你想用系列化。有幾個軟件包可以做到這一點:binary,xml,json和其他serialisers。 Json可能是最簡單的選擇 - 它將處理大部分數據類型。

一個簡單的例子from here

Person person = GetPerson(); 
string json = JsonConvert.SerializeObject(person, Formatting.Indented); 
File.WriteAllText(@"c:\person.json", json); 
0

的propper解決您的錯誤信息會..一個約束添加到您的通用方法調用。您將最終使用System.Collections命名空間。不是一般的System.Collections.Generic,但你能夠保持它..嘗試實施這樣的..

// note that you can add any base layer logic to a generic instance like this ... 
public void ExtractArrayFromStream<T>(string x, string y, ref T array) where T : IList { 
    // logical magic will be done here.. 
} 

有關使用約束上訪問documentation更多信息。


編輯 ...

這將跳過部分檢查它是否是一個數組或不是。

0

謝謝你們的答案。

我決定創建一個過載功能

public void extract_value_from_stream<T>(string str_name, string line, ref T var_name) 

public void extract_value_from_stream<T>(string str_name, string line, ref T[] var_name)