嗨,我们正在将遗留代码移植到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]' to type 'CsvHelper.Configuration.MemberMap
2 [CsvHelper.Tests.CsvReaderMappingTestsRuslan + SomeType,System.Object]'的对象。
看起来Map
上的签名已更改。 现在,它需要实际的成员类型作为通用成员,而不是object
。
也许还有另一种解决方法。 您这样做的目的是什么?
我们的用例是这样的:我们导入一堆不同的CSV文档,所有这些文档都有一组包含在基类中的公共属性(列),并在每个相应的实体类中定义了一些个体。 这种设计使我们可以在升级之前对所有这些函数使用单个ClassMap函数。 您是否认为可能有一个简单的解决方法?
看起来
Map
上的签名已更改。 现在,它需要实际的成员类型作为通用成员,而不是object
。也许还有另一种解决方法。 您这样做的目的是什么?
感谢您的提示! 我已经解决了这个问题并提出了拉取请求: https :
最有用的评论
感谢您的提示! 我已经解决了这个问题并提出了拉取请求: https :