perché non posso convertire da "System.IO.StreamWriter" a "CsvHelper.ISerializer"?


9

Sto cercando di scrivere il contenuto delle persone in un file CSV e quindi esportarlo, tuttavia sto riscontrando un errore di compilazione e il suo fallimento. l'errore è:

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

Non sono sicuro del perché questo accada a meno che, come sono sicuro, non l'abbia fatto in questo modo un sacco di volte.

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);
        }
    }
}

Potresti chiarire perché pensi che dovresti essere in grado di convertire da StreamWriterin ISerializer? StreamWriterfa parte di .NET stesso: non può implementare interfacce da un pacchetto di terze parti specifico.
Jon Skeet,

1
Ciò suggerisce che CsvHelper.CsvWriter(TextWriter)non rientra nell'ambito di applicazione. Ricontrolla che stai ricevendo la versione corretta del pacchetto e che StreamWriterè la solita classe ( System.IO.StreamWriter). Utilizzare "Vai a definizione" CsvWriterper ricontrollare.
Jeroen Mostert,

@JeroenMostert intendevi controllare csvWriter? l'ho fatto e appartiene alla classe CSVhelper che utilizza usando CsvHelper.Configuration; utilizzando CsvHelper.TypeConversion; utilizzando il sistema; utilizzando System.Collections; utilizzando System.Collections.Generic; utilizzando System.Dynamic; utilizzando System.Globalization; utilizzando System.IO; utilizzando System.Threading.Tasks;
Andy Stav,

Sì, ma ciò che il compilatore ti sta dicendo è che sta invocando il CsvWritercostruttore che lo prende ISerializere fallisce perché non c'è conversione. Avrebbe dovuto scegliere il CsvWritercostruttore che prende un TextWriter, poiché StreamWritereredita da quello, quindi o quel costruttore è mancante (per qualsiasi motivo) o la risoluzione di sovraccarico del compilatore è rotta (un po 'meno probabile, ma sono successe cose più strane).
Jeroen Mostert,

Risposte:


29

Si è verificato un cambiamento sostanziale con la versione 13.0.0. Ci sono stati molti problemi con la localizzazione, quindi @JoshClose richiede agli utenti di specificare ciò CultureInfoche vogliono usare. Ora devi includere CultureInfoquando crei CsvReadere 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);
        }
    }
}

Nota: CultureInfo.CurrentCulture era l'impostazione predefinita nelle versioni precedenti.

Prendere in considerazione

  • CultureInfo.InvariantCulture- Se controlli sia la scrittura che la lettura del file. In questo modo funzionerà, indipendentemente dalla cultura dell'utente sul proprio computer.
  • CultureInfo.CreateSpecificCulture("en-US")- Se ne hai bisogno per funzionare per una cultura particolare , indipendentemente dalla cultura dell'utente.

mi hai fatto risparmiare un sacco di tempo, grazie, David * lavora per v15.0.0
Konstantin Malikov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.