【发布时间】:2015-06-27 04:01:49
【问题描述】:
这可能是由于我对泛型方法的理解很糟糕,所以我提前道歉。
我正在尝试编写一个继承自 StreamWriter 的 csvWriter 类。我希望它拥有的一种方法是获取像数组或列表这样的集合并使用 String.Join 将其更改为逗号分隔的字符串,然后像往常一样编写它。我认为这会很简单,如果我使用方法重载它会很简单,但是我习惯了 python 并且泛型的想法对我来说感觉更好,所以我试了一下。
但是,我的尝试没有奏效。该方法似乎不知道传递给它的是什么类型,还是什么?
类:
public class csvWriter : System.IO.StreamWriter
{
public csvWriter(string filename) : base(filename)
{
}
public void WriteLineFromCollection<T>(T line)
{
string newLine = String.Join(",", line);
base.WriteLine(newLine);
}
}
调用它的行:
using (var reader = new csvReader(filename_in))
using (var writer = new csvWriter(filename_out))
{
while (!reader.EndOfStream)
{
string[] line = reader.ReadLine();
writer.WriteLineFromCollection<string[]>(line);
}
Console.Out.Write("PAUSE");
}
该文件以“System.String[]”结尾,而不是包含逗号分隔值的字符串。我认为我实际上是在给它参数的类型,而不是参数本身,但不知道为什么会这样。 WriteLineFromCollection 内部的调试器给了我感觉像是相互冲突的信息: 它说 line 是 string[] 类型,但是当我尝试 line[0] 时,它说“无法将 [] 索引应用于 T 类型的表达式。”
【问题讨论】:
-
如果传给它的不是集合怎么办?
-
需要将
line的类型改为IEnumerable<T>。 -
您是否尝试过将 T 更改为 IList
? -
@Lee IEnumberable 也不支持索引。
-
@Mike_G:他不需要索引。所以
IEnumerable<T>在这里完全合适(甚至更可取)。