使用泛型数组ref读取文件

时间:2015-09-21 08:58:31

标签: c# arrays generics ref

我正在开发一个小程序,它为一堆变量提供了一些保存和打开功能。 变量有各种类型,int - string - double和数组

我想实现一个可以处理所有不同数据类型的函数

我们说我有以下变量

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
                }          
            }
        }

无数组部分运行良好。在数组部分生成此错误:

  

无法将带有[]的索引应用于类型T

的表达式

有什么方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

  

保存并打开一堆变量的功能

您想使用序列化。有一些软件包可以做到:binary,xml,json和其他序列化程序。 Json可能是最简单的选择 - 它将处理开箱即用的大多数数据类型。

快速示例from here

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

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

<强> 修改 ...

这将跳过该部分以检查它是否是一个数组。

答案 2 :(得分: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)