mengapa saya tidak dapat mengkonversi dari 'System.IO.StreamWriter' ke 'CsvHelper.ISerializer'?

9

Mencoba menulis konten orang ke CSVfile dan kemudian mengekspornya, namun saya mendapatkan galat build dan kegagalannya. kesalahannya adalah:

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

Tidak yakin mengapa ini terjadi kecuali karena saya yakin saya telah melakukannya dengan cara ini berkali-kali.

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
sumber
Bisakah Anda mengklarifikasi mengapa Anda pikir Anda harus dapat mengkonversi dari StreamWriterke ISerializer? StreamWriteradalah bagian dari .NET itu sendiri - tidak dapat mengimplementasikan antarmuka dari paket pihak ketiga tertentu.
Jon Skeet
1
Ini menunjukkan CsvHelper.CsvWriter(TextWriter)tidak dalam ruang lingkup. Periksa kembali apakah Anda mendapatkan versi paket yang benar, dan itu StreamWriteradalah kelas biasa ( System.IO.StreamWriter). Gunakan "Pergi ke Definisi" CsvWriteruntuk mengecek.
Jeroen Mostert
@ JoeroenMostert maksud Anda untuk memeriksa csvWriter? saya lakukan dan itu milik kelas CSVhelper yang menggunakan menggunakan CsvHelper.Configuration; menggunakan CsvHelper.TypeConversion; menggunakan Sistem; menggunakan System.Collections; menggunakan System.Collections.Generic; menggunakan System.Dynamic; menggunakan System.Globalisasi; menggunakan System.IO; menggunakan System.Threading.Tasks;
Andy Stav
Ya, tetapi apa yang dikatakan kompiler adalah Anda memanggil CsvWriterkonstruktor yang membutuhkan ISerializer, dan gagal karena tidak ada konversi. Seharusnya memilih CsvWriterkonstruktor yang mengambil a TextWriter, karena StreamWritermewarisi dari itu, sehingga konstruktor itu hilang (untuk alasan apa pun) atau resolusi kelebihan kompiler rusak (sedikit kurang mungkin, tetapi hal-hal aneh telah terjadi).
Jeroen Mostert

Jawaban:

29

Ada perubahan besar dengan versi 13.0.0. Ada banyak masalah dengan pelokalan, jadi @JoshClose mengharuskan pengguna untuk menentukan yang CultureInfoingin mereka gunakan. Anda sekarang harus memasukkan CultureInfosaat membuat CsvReaderdan 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);
        }
    }
}

Catatan: CultureInfo.CurrentCulture adalah default di versi sebelumnya.

Mempertimbangkan

  • CultureInfo.InvariantCulture- Jika Anda mengontrol penulisan dan pembacaan file. Dengan begitu itu akan bekerja tidak peduli budaya apa yang dimiliki pengguna di komputer mereka.
  • CultureInfo.CreateSpecificCulture("en-US")- Jika Anda membutuhkannya untuk budaya tertentu , terlepas dari budaya pengguna.
David Specht
sumber
Anda menyelamatkan saya banyak waktu, terima kasih, David * bekerja untuk v15.0.0
Konstantin Malikov