【问题标题】:reading files using generic array ref使用通用数组 ref 读取文件
【发布时间】:2026-01-21 21:15:01
【问题描述】:

我正在开发一个小程序,该程序具有一些用于一堆变量的保存和打开功能。 变量有各种类型,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 类型的表达式

有没有办法解决这个问题?

【问题讨论】:

  • 你不能简单地创建一个类,它包含所有变量的属性,然后使用Json.NET 将其序列化为 JSON 吗?

标签: c# arrays generics ref


【解决方案1】:

您的错误消息的正确解决方案是.. 为您的 generic 方法调用添加一个约束。您最终将使用 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】:

    为一堆变量保存和打开功能

    你想使用序列化。有几个包可以做到这一点:二进制、xml、json 和其他序列化程序。 Json 可能是最简单的选择——它将处理开箱即用的大多数数据类型。

    一个简单的例子from here

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

    【讨论】:

      【解决方案3】:

      谢谢两位的回答。

      我决定创建一个重载函数

      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)
      

      【讨论】: