ทำไมฉันไม่สามารถแปลงจาก 'System.IO.StreamWriter' เป็น 'CsvHelper.ISerializer'


9

พยายามเขียนเนื้อหาของผู้คนไปยังไฟล์ CSV แล้วส่งออกมันอย่างไรก็ตามฉันได้รับข้อผิดพลาดของบิลด์และความล้มเหลว ข้อผิดพลาดคือ:

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

ไม่แน่ใจว่าทำไมสิ่งนี้ถึงเกิดขึ้นนอกเสียจากว่าฉันแน่ใจว่าฉันทำแบบนี้มาหลายครั้ง

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

คุณช่วยอธิบายได้ไหมว่าทำไมคุณคิดว่าคุณควรจะแปลงจากStreamWriterเป็นISerializer? StreamWriterเป็นส่วนหนึ่งของ. NET - มันไม่สามารถใช้อินเทอร์เฟซจากแพ็คเกจของบุคคลที่สามที่เฉพาะเจาะจงได้
Jon Skeet

1
คำแนะนำCsvHelper.CsvWriter(TextWriter)นี้ไม่ได้อยู่ในขอบเขต ตรวจสอบอีกครั้งว่าคุณได้รับแพ็คเกจที่StreamWriterถูกต้องและเป็นคลาสปกติ ( System.IO.StreamWriter) ใช้ "ไปที่คำจำกัดความ" CsvWriterเพื่อตรวจสอบอีกครั้ง
Jeroen Mostert

@JeroenMostert คุณหมายถึงตรวจสอบ csvWriter หรือไม่ ฉันทำและเป็นของคลาส CSVhelper ซึ่งใช้การใช้ CsvHelper.Configuration ใช้ CsvHelper.TypeConversion; ใช้ระบบ ใช้ System.Collections; ใช้ System.Collections.Generic; ใช้ System.Dynamic; ใช้ System.Globalization ใช้ System.IO; ใช้ System.Threading.Tasks;
Andy Stav

ใช่ แต่สิ่งที่คอมไพเลอร์บอกคุณคือมีการเรียกCsvWriterConstructor ที่รับISerializerและล้มเหลวเนื่องจากไม่มีการแปลง มันควรเลือกCsvWriterนวกรรมิกที่รับTextWriterเนื่องจากตั้งแต่StreamWriterสืบทอดดังนั้นคอนสตรัคเตอร์นั้นจะหายไป (ไม่ว่าจะด้วยเหตุผลใดก็ตาม) หรือการแก้ไขโอเวอร์โหลดของคอมไพเลอร์เสีย (มีโอกาสน้อยลง
Jeroen Mostert

คำตอบ:


29

มีการเปลี่ยนแปลงการแตกหักกับรุ่น 13.0.0 มีปัญหามากมายเกี่ยวกับการแปลภาษาท้องถิ่นดังนั้น @JoshClose ต้องการให้ผู้ใช้ระบุสิ่งที่CultureInfoพวกเขาต้องการใช้ ตอนนี้คุณต้องรวมถึงCultureInfoเมื่อมีการสร้างและ CsvReader https://github.com/JoshClose/CsvHelper/issues/1441CsvWriter

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

หมายเหตุ: CultureInfo.CurrentCultureเป็นค่าเริ่มต้นในรุ่นก่อนหน้า

พิจารณา

  • CultureInfo.InvariantCulture- หากคุณควบคุมทั้งการเขียนและการอ่านไฟล์ ด้วยวิธีนี้มันจะทำงานไม่ว่าผู้ใช้จะมีวัฒนธรรมอะไรในคอมพิวเตอร์
  • CultureInfo.CreateSpecificCulture("en-US")- หากคุณต้องการให้มันทำงานเพื่อวัฒนธรรมเฉพาะโดยไม่ขึ้นกับวัฒนธรรมของผู้ใช้

คุณประหยัดเวลาได้มากขอบคุณ David * ใช้งานได้สำหรับ v15.0.0
Konstantin Malikov
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.