我们正在将遗留代码移植到dotnet标准,并且遇到了[我认为] CsvHelper 2.5.0 net451中没有的问题。
问题似乎是CsvReader无法管理解析映射中基础属性的正确ReturnType,并试图将它们全部映射到System.Object。>
我已经设法在您的解决方案中通过单元测试来重现它:
[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}; }
报告错误:
测试方法CsvHelper.Tests.CsvReaderMappingTestsRuslan.CanCreateMapsFromDynamicList抛出异常:System.InvalidCastException:无法强制转换的对象类型'CsvHelper.Configuration.MemberMap2 [CsvHelper.Tests.CsvReaderMappingTestsRuslan + SomeType,System.String]'输入'CsvHelper.Configuration.MemberMap2 [CsvHelper.Tests.CsvReaderMappingTestsRuslan + SomeType,System.Object]'。
P.S。我尝试将“映射”属性更改为静态并获得相同的结果。
我们正在将遗留代码移植到dotnet标准,并且遇到了[我认为] CsvHelper 2.5.0 net451中没有的问题。问题似乎是CsvReader无法解决...
通过添加此重载方法解决: