You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor父组件向子控件传递Type类型,CsvHelper读取数据为空

解决CsvHelper GetRecords返回空数据的问题

问题根源

你调用了reader.ReadToEnd()输出CSV内容,这个操作会将StreamReader的读取指针移动到流的末尾,后续CsvReader再读取时,流里已经没有剩余数据了,所以GetRecords返回空集合。

另外,代码里Type.GetType(csvRows.FullName)是多余的——你已经通过组件参数拿到了csvRows这个Type实例,直接用它就行,没必要再通过FullName重新获取。

修复方案

方案1:调整日志输出位置

把读取并打印CSV内容的代码移到CsvReader处理完成之后,避免提前消耗流:

using (StreamReader reader = new StreamReader(ms))
{
    CsvReader csv = new CsvReader(reader, CultureInfo.InvariantCulture);
    var csvReords = csv.GetRecords(csvRows); // 直接使用传入的Type实例
    Console.WriteLine($"type of csvRows {csvRows} record count {csvReords.Count()}");
    Console.WriteLine($"Serialize {System.Text.Json.JsonSerializer.Serialize(csvReords)}");
    
    // 打印CSV内容(需要重置流位置)
    ms.Seek(0, SeekOrigin.Begin);
    Console.WriteLine($"StreamReader {reader.ReadToEnd()}");
}

方案2:读取后重置流指针

如果必须先打印CSV内容,在调用ReadToEnd()后,将流的位置重置到起始处,再创建CsvReader:

using (StreamReader reader = new StreamReader(ms))
{
    Console.WriteLine($"StreamReader {reader.ReadToEnd()}");
    ms.Seek(0, SeekOrigin.Begin); // 重置流到起始位置
    reader.DiscardBufferedData(); // 清空StreamReader的缓存
    
    CsvReader csv = new CsvReader(reader, CultureInfo.InvariantCulture);
    var csvReords = csv.GetRecords(csvRows);
    Console.WriteLine($"type of csvRows {csvRows} record count {csvReords.Count()}");
    Console.WriteLine($"Serialize {System.Text.Json.JsonSerializer.Serialize(csvReords)}");
}

额外注意事项

  • 确保你的CsvRows类的属性名称和CSV文件的列名匹配(或者通过CsvHelper的特性配置映射关系),否则CsvHelper无法正确解析数据。
  • GetRecords返回的是延迟加载的枚举,调用Count()会触发实际读取,如果你后续还要使用数据,建议提前转成List:var csvRecords = csv.GetRecords(csvRows).ToList();

内容的提问来源于stack exchange,提问作者Prashant Khamkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 22:35:51