pourquoi ne puis-je pas convertir 'System.IO.StreamWriter' en 'CsvHelper.ISerializer'?

9

J'essaie d'écrire le contenu de personnes dans un fichier CSV, puis de l'exporter, mais je reçois une erreur de génération et son échec. l'erreur est:

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

Je ne sais pas pourquoi cela se produit, à moins que je sois certain de l'avoir fait de cette façon de nombreuses fois.

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);
        }
    }
}
Andy Stav
la source
Pourriez-vous préciser pourquoi vous pensez que vous devriez pouvoir convertir de StreamWriterà ISerializer? StreamWriterfait partie de .NET lui-même - il ne peut pas implémenter d'interfaces à partir d'un package tiers spécifique.
Jon Skeet
1
Cela suggère que ce CsvHelper.CsvWriter(TextWriter)n'est pas dans la portée. Vérifiez que vous obtenez la bonne version du package, et c'est StreamWriterla classe habituelle ( System.IO.StreamWriter). Utilisez "Aller à la définition" CsvWriterpour revérifier.
Jeroen Mostert
@JeroenMostert vouliez-vous vérifier csvWriter? je l'ai fait et son appartient à la classe CSVhelper qui utilise l'aide de CsvHelper.Configuration; using CsvHelper.TypeConversion; en utilisant le système; using System.Collections; using System.Collections.Generic; en utilisant System.Dynamic; en utilisant System.Globalization; using System.IO; using System.Threading.Tasks;
Andy Stav
Oui, mais ce que le compilateur vous dit, c'est qu'il appelle le CsvWriterconstructeur qui prend un ISerializer, et échoue car il n'y a pas de conversion. Il aurait dû choisir le CsvWriterconstructeur qui prend un TextWriter, car il en StreamWriterhérite, donc soit ce constructeur est manquant (pour une raison quelconque) soit la résolution de surcharge du compilateur est cassée (un peu moins probable, mais des choses plus étranges se sont produites).
Jeroen Mostert

Réponses:

29

Il y avait un changement de rupture avec la version 13.0.0. Il y a eu de nombreux problèmes avec la localisation, donc @JoshClose oblige les utilisateurs à spécifier ce CultureInfoqu'ils veulent utiliser. Vous devez maintenant inclure CultureInfolors de la création CsvReaderet 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);
        }
    }
}

Remarque: CultureInfo.CurrentCulture était la valeur par défaut dans les versions précédentes.

Considérer

  • CultureInfo.InvariantCulture- Si vous contrôlez à la fois l'écriture et la lecture du fichier. De cette façon, cela fonctionnera quelle que soit la culture de l'utilisateur sur son ordinateur.
  • CultureInfo.CreateSpecificCulture("en-US")- Si vous en avez besoin pour travailler pour une culture particulière , indépendamment de la culture de l'utilisateur.
David Specht
la source
vous m'avez fait gagner beaucoup de temps, merci, David * travaille pour la v15.0.0
Konstantin Malikov