【问题标题】:CsvHelper "TypeConverterException: Converting IEnumerable types is not supported for a single field."CsvHelper“TypeConverterException:单个字段不支持转换 IEnumerable 类型。”
【发布时间】:2020-11-28 03:07:57
【问题描述】:

我正在尝试从我从数据库中检索到的列表中构建一个简单的用户数据 csv。当我运行代码时,读取的 csv.WriteRecods(data) 崩溃了 “TypeConverterException:单个字段不支持转换 IEnumerable 类型。”

var mem = new MemoryStream();
        var writer = new StreamWriter(mem);
        var csv = new CsvWriter(writer, CultureInfo.CurrentUICulture);

        var data = myList.Select(x =>
           {
               dynamic item = new ExpandoObject();
               var dict = item as IDictionary<string, object>;

               dict["DisplayName"] = x.User.DisplayName;
               dict["Email"] = x.User.Email;
               return dict;
           }).ToList();

        csv.WriteRecords(data);

        writer.Flush();
        mem.Seek(0, SeekOrigin.Begin);
        return File(mem, "text/csv", $"Test_{DateTime.Now.ToString("yyyy-MM-dd_HHmmss")}.csv");

过去我在 VS 中使用 CsvHelper v12 nuget 包用于 Net Core,但从未遇到过这个问题。我只是在较新的 V15 中发现此问题,但由于应用程序的其他部分使用该包,我无法降级到 v12。

【问题讨论】:

  • 我正在努力解决这个问题...所以您正在尝试编写一个 CSV,其中一行是包含单个字典的单个元素?您能否向我们展示您希望实现的 CSV 输出?也许有更好的方法来做你想做的与 v15 兼容的事情

标签: c# visual-studio asp.net-core .net-core


【解决方案1】:

所以出于好奇,我想看看发生了什么事。我开始了一个新项目并复制并粘贴了您的代码。我无法让它按原样在 v15 或 v12 上运行。它在两个版本中都抛出了相同的异常。

所以我开始研究它。据我所知,CsvHelper 并不真正支持字典。但是据我所知,您不需要按照自己的方式进行操作。您可以创建“映射器”对象,该对象可以从要序列化的模型中提取特定信息:

public class TestModelWithUserMap : ClassMap<TestModelWithUser>
{
    public TestModelWithUserMap()
    {
        Map(m => m.User.DisplayName);
        Map(m => m.User.Email);
    }
}

private static void TestCsvHelper()
{
    // generate some random data
    var rnd = new Random();
    var lst = Enumerable.Range(0, 50).Select(x => new TestModelWithUser
    {
        User = new UserModel
        {
            DisplayName = new string(Enumerable.Range(0, 20).Select(_ => Convert.ToChar(rnd.Next(0x61, 0x7b))).ToArray()),
            Email = new string(Enumerable.Range(0, 15).Select(_ => Convert.ToChar(rnd.Next(0x61, 0x7b))).ToArray())
        }
    });

    // open file and begin to write
    using (var fs = File.OpenWrite(@"c:\users\andy\desktop\test.csv"))
    using (var sr = new StreamWriter(fs))
    using (var csv = new CsvWriter(sr))
    {
        // register our mapper
        csv.Configuration.RegisterClassMap(new TestModelWithUserMap());
        // write all records
        csv.WriteRecords(lst);
    }
}

文件的输出如下所示:

这种方式似乎更加高效和可维护,因为您不必处理动态/ExpandoObjects。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    • 2012-03-16
    相关资源
    最近更新 更多