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.MemberMap2[CsvHelper.Tests.CsvReaderMappingTestsRuslan+SomeType,System.String]' to type 'CsvHelper.Configuration.MemberMap
2 [CsvHelper.Tests.CsvReaderMappingTestsRuslan + SomeType, System.Object]' kann nicht umgewandelt werden.
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 vonobject
.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
Hilfreichster Kommentar
danke für den Tipp! Ich habe dies behoben und eine Pull-Anfrage gestellt: https://github.com/JoshClose/CsvHelper/pull/1505