Warum kann ich nicht von 'System.IO.StreamWriter' zu 'CsvHelper.ISerializer' konvertieren?


9

Beim Versuch, den Inhalt von Personen in eine CSV-Datei zu schreiben und diese dann zu exportieren, wird jedoch ein Erstellungsfehler angezeigt, der fehlschlägt. Der Fehler ist:

cannot convert from 'System.IO.StreamWriter' to 'CsvHelper.ISerializer'

Ich bin mir nicht sicher, warum dies geschieht, es sei denn, ich bin mir sicher, dass ich es viele Male so gemacht habe.

private void ExportAsCSV()
{
    using (var memoryStream = new MemoryStream())
    {
        using (var writer = new StreamWriter(memoryStream))
        {
            using (var csv = new CsvHelper.CsvWriter(writer))
            {
                csv.WriteRecords(people);
            }

            var arr = memoryStream.ToArray();
            js.SaveAs("people.csv",arr);
        }
    }
}

Könnten Sie erklären , warum Sie denken , Sie sollten fähig sein , von konvertieren StreamWriterzu ISerializer? StreamWriterist Teil von .NET selbst - es kann keine Schnittstellen von einem bestimmten Paket eines Drittanbieters implementieren.
Jon Skeet

1
Dies deutet darauf hin, dass dies CsvHelper.CsvWriter(TextWriter)nicht im Geltungsbereich liegt. Stellen Sie sicher, dass Sie die richtige Version des Pakets erhalten, und das StreamWriterist die übliche Klasse ( System.IO.StreamWriter). Verwenden Sie "Gehe zu Definition", um dies CsvWriterzu überprüfen.
Jeroen Mostert

@JeroenMostert wolltest du csvWriter überprüfen? Ich habe es getan und es gehört zur CSVhelper-Klasse, die CsvHelper.Configuration verwendet. using CsvHelper.TypeConversion; using System; using System.Collections; using System.Collections.Generic; using System.Dynamic; using System.Globalization; using System.IO; using System.Threading.Tasks;
Andy Stav

Ja, aber der Compiler sagt Ihnen, dass er den CsvWriterKonstruktor aufruft, der eine benötigt ISerializer, und fehlschlägt, da keine Konvertierung erfolgt. Es sollte den CsvWriterKonstruktor ausgewählt haben, der a nimmt TextWriter, da er davon StreamWritererbt, sodass entweder dieser Konstruktor fehlt (aus welchem ​​Grund auch immer) oder die Überlastungsauflösung des Compilers fehlerhaft ist (etwas weniger wahrscheinlich, aber seltsamere Dinge sind passiert).
Jeroen Mostert

Antworten:


29

Mit Version 13.0.0 gab es eine bahnbrechende Änderung. Es gab viele Probleme mit der Lokalisierung, daher müssen Benutzer bei @JoshClose angeben, welche CultureInfosie verwenden möchten. Sie müssen jetzt CultureInfobeim Erstellen CsvReaderund einbeziehen CsvWriter. https://github.com/JoshClose/CsvHelper/issues/1441

private void ExportAsCSV()
{
    using (var memoryStream = new MemoryStream())
    {
        using (var writer = new StreamWriter(memoryStream))
        {
            using (var csv = new CsvHelper.CsvWriter(writer, System.Globalization.CultureInfo.CurrentCulture)
            {
                csv.WriteRecords(people);
            }

            var arr = memoryStream.ToArray();
            js.SaveAs("people.csv",arr);
        }
    }
}

Hinweis: CultureInfo.CurrentCulture war die Standardeinstellung in früheren Versionen.

Erwägen

  • CultureInfo.InvariantCulture- Wenn Sie sowohl das Schreiben als auch das Lesen der Datei steuern. Auf diese Weise funktioniert es unabhängig von der Kultur, die der Benutzer auf seinem Computer hat.
  • CultureInfo.CreateSpecificCulture("en-US")- Wenn Sie es benötigen, um für eine bestimmte Kultur zu arbeiten , unabhängig von der Benutzerkultur.

Sie haben mir viel Zeit gespart, danke, David * arbeitet für v15.0.0
Konstantin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.