tại sao tôi không thể chuyển đổi từ 'System.IO.StreamWriter' thành 'CsvHelper.ISerializer'?


9

Cố gắng viết nội dung của mọi người vào CSVfile và sau đó xuất nó, tuy nhiên tôi đang gặp lỗi xây dựng và nó không thành công. lỗi là:

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

Không chắc chắn tại sao điều này xảy ra trừ khi tôi chắc chắn tôi đã thực hiện nó theo cách này rất nhiều lần.

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

Bạn có thể làm rõ lý do tại sao bạn nghĩ rằng bạn sẽ có thể chuyển đổi từ StreamWritersang ISerializer? StreamWriterlà một phần của chính .NET - nó không thể triển khai các giao diện từ gói bên thứ ba cụ thể.
Jon Skeet

1
Điều này cho thấy CsvHelper.CsvWriter(TextWriter)không có trong phạm vi. Kiểm tra kỹ xem bạn có nhận đúng phiên bản của gói không, và đó StreamWriterlà lớp thông thường ( System.IO.StreamWriter). Sử dụng "Chuyển đến Định nghĩa" trên CsvWriterđể kiểm tra lại.
Jeroen Mostert

@JeroenMostert bạn có ý kiểm tra csvWriter không? tôi đã làm và nó thuộc về lớp CSVrcper sử dụng CsvHelper.Configuration; sử dụng CsvHelper.TypeConversion; sử dụng hệ thống; sử dụng System.Collections; sử dụng System.Collections.Generic; sử dụng System.Docate; sử dụng System.Globalization; sử dụng System.IO; sử dụng System.Threading.T Nhiệm vụ;
Andy Stav

Có, nhưng điều mà trình biên dịch đang nói với bạn là nó đang gọi hàm CsvWritertạo mất một lỗi ISerializervà không thành công vì không có chuyển đổi. Nó nên chọn hàm CsvWritertạo lấy một TextWriter, vì StreamWriterthừa hưởng từ đó, vì vậy hoặc hàm tạo đó bị thiếu (vì bất kỳ lý do gì) hoặc độ phân giải quá tải của trình biên dịch bị phá vỡ (ít có thể xảy ra hơn, nhưng những điều kỳ lạ hơn đã xảy ra).
Jeroen Mostert

Câu trả lời:


29

Có một sự thay đổi đột phá với phiên bản 13.0.0. Đã có nhiều vấn đề với nội địa hóa, vì vậy @JoshClose đang yêu cầu người dùng chỉ định những CultureInfogì họ muốn sử dụng. Bây giờ bạn cần bao gồm CultureInfokhi tạo CsvReaderCsvWriter. 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);
        }
    }
}

Lưu ý: CultureInfo.CurrentCulture là mặc định trong các phiên bản trước.

Xem xét

  • CultureInfo.InvariantCulture- Nếu bạn kiểm soát cả việc viết và đọc tệp. Bằng cách đó, nó sẽ hoạt động cho dù người dùng có văn hóa gì trên máy tính của họ.
  • CultureInfo.CreateSpecificCulture("en-US")- Nếu bạn cần nó để làm việc cho một nền văn hóa cụ thể , độc lập với văn hóa của người dùng.

bạn đã tiết kiệm cho tôi rất nhiều thời gian, cảm ơn, David * làm việc cho v15.0.0
Konstantin Malikov
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.