Csvhelper: Das Erstellen von Karten aus einer dynamischen Sammlung funktioniert nicht mehr: Objekt vom Typ System.String kann nicht in System.Object umgewandelt werden.)

Erstellt am 14. Apr. 2020  ·  3Kommentare  ·  Quelle: JoshClose/CsvHelper

Hallo, wir portieren Legacy-Code auf den Dotnet-Standard und haben ein Problem, das in CsvHelper 2.5.0 net451 nicht vorhanden war.

Das Problem scheint zu sein, dass CsvReader es nicht schafft, die korrekten ReturnType der zugrunde liegenden Eigenschaften in den Zuordnungen aufzulösen, und versucht, sie alle System.Object zuzuordnen

Ich habe es geschafft, es mit einem Unit-Test in Ihrer Lösung zu reproduzieren:


[TestMethod]
public void CanCreateMapsFromDynamicList()
{
    var data = new List<string[]>
    {
        new[] { "Col1", "Col2" },
        new[] { "1", "one" },
        new[] { "2", "two" }
    };

    var queue = new Queue<string[]>(data);
    var parserMock = new ParserMock(queue);

    var csvReader = new CsvReader(parserMock);
    csvReader.Configuration.RegisterClassMap<SomeTypeClassMap>();

    var records = csvReader.GetRecords<SomeType>().ToList();

    Assert.IsNotNull(records);
    Assert.AreEqual(2, records.Count);

}

public class SomeTypeClassMap : ClassMap<SomeType>
{
    public SomeTypeClassMap()
    {
        Map(x => x.Id).Ignore();
        var t = new SomeType();

        foreach (var mapping in t.Mappings)
        {
            Map(mapping);
        }
    }
}

public class SomeType
{
    public int Id { get; set; }
    public string Col1 { get; set; }
    public string Col2 { get; set; }

    public IEnumerable<Expression<Func<SomeType, dynamic>>> Mappings =>
        new List<Expression<Func<SomeType, dynamic>>> {i => i.Col1, i => i.Col2};
}

Fehler gemeldet:

Testmethode CsvHelper.Tests.CsvReaderMappingTestsRuslan.CanCreateMapsFromDynamicList hat eine Ausnahme ausgelöst:
System.InvalidCastException: Objekt vom Typ 'CsvHelper.Configuration.MemberMap 2[CsvHelper.Tests.CsvReaderMappingTestsRuslan+SomeType,System.String]' to type 'CsvHelper.Configuration.MemberMap 2 [CsvHelper.Tests.CsvReaderMappingTestsRuslan + SomeType, System.Object]' kann nicht umgewandelt werden.

bug

Hilfreichster Kommentar

Anscheinend hat sich die Signatur auf Map geändert. Es erfordert jetzt den tatsächlichen Mitgliedstyp als Generikum anstelle von object .

Vielleicht gibt es einen anderen Weg, um dies zu umgehen. Was ist Ihr Ziel dabei?

danke für den Tipp! Ich habe dies behoben und eine Pull-Anfrage gestellt: https://github.com/JoshClose/CsvHelper/pull/1505

Alle 3 Kommentare

Anscheinend hat sich die Signatur auf Map geändert. Es erfordert jetzt den tatsächlichen Mitgliedstyp als Generikum anstelle von object .

Vielleicht gibt es einen anderen Weg, um dies zu umgehen. Was ist Ihr Ziel dabei?

Unser Anwendungsfall ist folgender: Wir importieren eine Reihe verschiedener CSV-Dokumente, die alle eine Reihe gemeinsamer Eigenschaften (Spalten) aufweisen, die in einer Basisklasse enthalten sind, und einige Personen, die in den jeweiligen Entitätsklassen definiert sind. Dieses Design ermöglichte es uns, vor dem Upgrade für alle eine einzige ClassMap-Funktion zu verwenden. Denken Sie, dass es eine einfache Umgehung geben könnte?

Anscheinend hat sich die Signatur auf Map geändert. Es erfordert jetzt den tatsächlichen Mitgliedstyp als Generikum anstelle von object .

Vielleicht gibt es einen anderen Weg, um dies zu umgehen. Was ist Ihr Ziel dabei?

danke für den Tipp! Ich habe dies behoben und eine Pull-Anfrage gestellt: https://github.com/JoshClose/CsvHelper/pull/1505

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen