我正在开发一个小程序,它为一堆变量提供了一些保存和打开功能。 变量有各种类型,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
有什么方法可以解决这个问题吗?
答案 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)